2010-08-12 21 views
0

我尝试使用execlp,fork和pipes来制作一个简单的程序时遇到一些问题。 手头的程序被假定为“last | head -5 | sort”,但它不起作用。这是代码。Unix中的多进程编程

#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

你有错误消息或错误号号码? – 2010-08-12 12:28:28

回答

0

您需要实际创建第二个管道,然后将其用于head进程的标准输出和sort进程的标准输入。在你的第二个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()错误后子进程)

+0

这样做后,执行时会出现以下错误: Head:写入错误:无效的文件描述符。 有什么想法? – olbrich 2010-08-12 15:00:26

+0

@olbrich:对我来说工作正常 - 也许你没有得到所有的改变(你现在在头部路径中调用'buzon2 [1]'而不是'buzon [1]'调用'dup() '?) – caf 2010-08-12 22:13:39

+0

现在工作正常,我在dup()中将buzon2 [1]与buzon [1]混淆了。非常感谢你! – olbrich 2010-08-13 09:02:21