C系统调用pipe, fork和execl

C system calls pipe, fork, and execl

本文关键字:execl fork 系统调用 pipe      更新时间:2023-10-16

我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: %sn",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]时,为什么要通过管道写文件名?

你没有检查你的读长度和你的缓冲区长度。

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

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

将执行您的请求,但是您关闭了stdout,因此cat(而不是execl)将失败,并且您没有检查其退出代码。