C系统调用pipe,fork和execl

时间:2013-05-11 18:08:52

标签: c++ c exec fork pipe

我在fork()中创建了一个子进程并在它们之间创建了管道,并且能够将参数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);
}

1 个答案:

答案 0 :(得分:0)

为什么在fork()保留argv[1]时通过管道编写文件名?

您没有根据缓冲区长度检查读取长度。

您没有发送尾随的nul(strlen()不包括它),因此buffer中的文件名字符串终结符未初始化。将+1附加到您的所有strlen()值以进行更正。然后,

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

会执行您要求的操作,但您已关闭stdout,因此cat(而不是execl)将失败,并且您不会检查其退出代码。< / p>