我 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/