c++ - C 系统调用 pipe、fork 和 execl

标签 c++ c exec fork pipe

我 fork() 了一个子进程并在它们之间创建了管道,并且能够将参数 argv[1] 发送给子进程。我希望 child 获取 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)将失败,您'不检查其退出代码。

关于c++ - C 系统调用 pipe、fork 和 execl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500247/

相关文章:

c++ - 区分两个包扩展

c++ - 是否可以更改从 GetTickCount() 返回的刻度计数值?

c++ - 基于 Linux 的集群上的 CPUTIME 和 WALLTIME C++ 代码

c - Qsort 及其问题

c++ - 大型项目的 Emacs 教程

c - fgets 自然地在 C 中放置一个终止零?

java - exec 命令在 php 脚本中不起作用

c++ - memory_order_acquire 真的足以锁定自旋锁吗?

Java - Runtime.getRuntime().exec() 这是怎么回事?

linux - 为什么 find -exec mv {} ./target/+ 不起作用?