我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 回答
当
fork()
保留argv[1]
时,为什么要通过管道写文件名?您没有根据缓冲区长度检查读取长度 .
你没有传输尾随的nul(
strlen()
中的strlen()
不是't include it) so the filename string'的终止符是未初始化的 . 将+1
附加到你的所有strlen()
值以纠正它 . 然后,会做你要求的,但你已经关闭
stdout
所以cat
(不是execl
)会失败,你没有检查它的退出代码 .