2013-05-11 50 views
1

我fork()'一個子進程和它們之間創建的管道,我可以發送參數argv [1]給孩子。我希望孩子從argv [1]獲取該文件名並執行execl(「/ bin/cat」,「cat」,(char *)0); 如何將傳遞給孩子的文件名路由到execl?C系統調用管道,叉子和execl

圍是我clearity代碼:

int main(int argc, char ** argv){ 
    int fds[2]; 
    char buffer[100]; 
    int status; 

    if(pipe(fds) == -1){ 
     perror("pipe creation failed"); 
     exit(EXIT_FAILURE); 
    } 

    switch (fork()){ 

    case 0://child 
     close(fds[1]); //close stdout so can only do stdin 
     read(fds[0],buffer,strlen(argv[1])); 
     printf("from parent: %s\n",argv[1]); 
     execl("/bin/cat","cat",(char*)0); 
     perror("cat failed"); 
     exit(20); 
     break; 

     case -1: //fork failure 
     perror("fork failure"); 
     exit(EXIT_FAILURE); 

     default: //parent 
     close(fds[0]); //close stdin so only can do stdout 
     write(fds[1],argv[1], strlen(argv[1]));    
    } 

    return (EXIT_SUCCESS); 
} 

回答

0

你爲什麼要通過管道寫文件名時fork()保留argv[1]

您沒有檢查您的讀取長度與您的緩衝區長度。

您不會傳輸尾隨nul(strlen()不包含它),因此buffer中的文件名字符串終止符未初始化。將+1附加到您的所有strlen()值以更正該值。然後,

execl("/bin/cat","cat",buffer,(char*)0); 

會做你要求什麼,但你已經關閉stdout所以cat(不是execl)會失敗,而你沒有檢查它的退出代碼。

+0

謝謝,那麼讓我再問你一個問題。我想發送一個字符串給孩子,孩子將字符串排序並將其發送給另一個孩子以刪除重複。我怎麼能通過一個exec()給另一個孩子? – codeBarer 2013-05-11 18:50:57

+0

@ user2250263使用'close()'和'dup2()將'stdout' – jthill 2013-05-11 19:09:07