首页 文章

C系统调用pipe,fork和execl

提问于
浏览
1

我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

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

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

    你没有传输尾随的nul( strlen() 中的 strlen() 不是't include it) so the filename string'的终止符是未初始化的 . 将 +1 附加到你的所有 strlen() 值以纠正它 . 然后,

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

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

相关问题