2010-08-12 83 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