C系统调用pipe, fork和execl
C system calls pipe, fork, and execl
我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
)将失败,并且您没有检查其退出代码。
相关文章:
- execlp() 在 fork() 之后无法正常工作
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 为什么if(fork()==0){getpid()}和popen()进程返回相同的进程id
- While循环在fork和execvp调用后没有继续
- fork(),在C中共享内存和指针
- fork/pipes和运行多个程序
- 如何在execl中使用标准输入'<'?
- Gdb 未加载要在 fork 使用的源文件
- fork() 无法使用 Cygwin
- PID 不使用 fork() 定义类型
- 为什么我应该使用 fork() 来守护我的进程?
- 修改跨 fork() 的指针中的数据
- iwlist 在使用 execl 调用时尝试扫描所有接口
- C++ fork() 和 execl() 调用 (Linux) 后无法识别命令
- execl() 的参数传递到哪里
- Linux fork - execl,执行的进程变成僵尸
- 如何在fork()中使用execl()并杀死它
- c++fork,不需要等待,即可解压execl
- C系统调用pipe, fork和execl