尝试使用execlp,fork和pipe创建一个简单的程序时遇到了一些问题。 手头的程序被用来做“last | head -5 | sort”,但它不起作用。这是代码。
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
//last |head -5| sort
int main(int argc, char* argv[]){
int buzon[2];
int buzon2[2];
if(pipe(buzon) < 0)
error("error de pipe");
switch(fork()){
case -1:
error("error de fork");
case 0:
if(close(1) < 0) error("error de close");
if(dup(buzon[1]) < 0) error("error de dup");
if(close(buzon[0]) < 0) error("error de close");
if(close(buzon[1]) < 0) error("error de close");
execlp("last", "last", NULL);
error("error de execlp");
}
switch(fork()){
case -1:
error("error de fork");
case 0:
if(close(0) < 0) error("error de close");
if(close(1) < 0) error("error de close");
if(dup(buzon[0]) < 0) error("error de dup");
if(dup(buzon[1]) < 0) error("error de dup");
if(close(buzon[0]) < 0) error("error de close");
if(close(buzon[1]) < 0) error("error de close");
execlp("head", "head", "-n 5", NULL);
error("error de execlp");
}
switch(fork()){
case -1:
error("error de fork");
case 0:
if(close(0)<0) error("error de close");
if(dup(buzon[0]) != 1) error("error de dup");
if(close(buzon[0]) < 0) error("error de close");
if(close(buzon[1]) < 0) error("error de close");
execlp("sort", "sort", NULL);
error("error de execlp");
}
if(close(buzon[0]) < 0) error("error de close");
if(close(buzon[1]) < 0) error("error de close");
while(wait(NULL) != -1);
}
任何失败的想法。问题是当我使用2个管道时。如果我制作一个只使用1个管道的程序,它就可以工作。
答案 0 :(得分:0)
您需要实际创建第二个管道,然后将其用于head
进程的stdout和sort
进程的stdin。在您的第二个fork()
:
close(buzon[1]);
pipe(buzon2);
/* Now buzon[0], buzon2[0] and buzon2[1] are still open in this process */
switch(fork()){
case -1:
error("error de fork");
case 0:
if(close(0) < 0) error("error de close");
if(close(1) < 0) error("error de close");
if(dup(buzon[0]) < 0) error("error de dup");
if(dup(buzon2[1]) < 0) error("error de dup");
if(close(buzon[0]) < 0) error("error de close");
if(close(buzon2[0]) < 0) error("error de close");
if(close(buzon2[1]) < 0) error("error de close");
execlp("head", "head", "-n 5", NULL);
error("error de execlp");
exit(1);
}
close(buzon[0]);
close(buzon2[1]);
/* Now buzon2[0] is still open in this process */
switch(fork()){
case -1:
error("error de fork");
case 0:
if(close(0)<0) error("error de close");
if(dup(buzon2[0]) < 0) error("error de dup");
if(close(buzon2[0]) < 0) error("error de close");
execlp("sort", "sort", NULL);
error("error de execlp");
exit(1);
}
close(buzon2[0]);
(您应该exit()
错误后execlp()
子进程