【问题标题】:C system calls pipe, fork, and execlC 系统调用 pipe、fork 和 execl
【发布时间】:2013-05-11 18:08:52
【问题描述】:

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

【问题讨论】:

    标签: c++ c exec fork pipe


    【解决方案1】:

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

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

    您没有传输尾随的 nul(strlen() 不包括它),因此buffer 中的文件名字符串的终止符未初始化。将+1 附加到您的所有strlen() 值以纠正该问题。那么,

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

    会按照你的要求做,但你已经关闭了stdout,所以cat(不是execl)会失败,你没有检查它的退出代码。

    【讨论】:

    • 谢谢,那我再问你一个问题。我想向孩子发送一个字符串,孩子对字符串进行排序并将其发送给另一个孩子以删除重复项。如何将一个 exec() 的 put 传递给另一个孩子?
    • @user2250263 使stdout 成为带有close()dup2() 的孩子的管道
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2012-02-02
    • 2017-05-07
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多