簡體   English   中英

C系統調用管道,派生和execl

[英]C system calls pipe, fork, and execl

我派生了一個子進程,並在它們之間創建了管道,並能夠將參數argv [1]發送給子進程。 我希望孩子使用argv [1]提供的文件名並執行execl(“ / bin / cat”,“ cat”,(char *)0); 如何將通過管道傳遞給子級的文件名路由到execl?

隨函附上我的代碼,以提高清晰度:

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);
}

fork()保留argv[1]時,為什么要通過管道寫入文件名?

您無需根據緩沖區長度來檢查讀取長度。

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

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

將執行您所要求的操作,但是您已經關閉了stdout因此cat (不是execl )將失敗,並且您沒有檢查其退出代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM