执行后关闭(管道[1])
close(pipe[1]) after exec
我有烟斗。
int anotherPipe[2];
make(anotherPipe);
以下两个进程都可以访问此管道。
进程 A:
close(anotherPipe[0]);
dup2(anotherPipe[1], 1); //redirect stdout to pipe
execl("/usr/bin/who", "usr/bin/who", NULL);
close(anotherPipe[1]); //this is never executed
进程 B:
close(anotherPipe[1]);
read(anotherPipe[0], stringbuffer, bytestoread);
printf("%s\n", buffer);
printf("checkpoint\n");
close(anotherPipe[0]);
"who" 命令的 execl 输出通过管道重定向到进程 B,并在其中打印。但是现在我的进程 B 没有终止,尽管打印了检查点。
'not terminating' 我的意思是终端中不显示以下内容:
myusername@ubuntucomputer:~$
这里发生了什么,如何解决的?
编辑:解决了非终止进程 B 的问题。它终止了,但我的顶级进程在 A 和 B 之前完成,所以
myusername@ubuntucomputer:~$
印得早了很多。我使用了 waitpid() 现在一切正常。
如果 execl()
成功,原始程序 运行s 之后没有任何内容,因为它用您要求它 运行 的程序替换进程的内容。您需要关闭管道 before execl
:
close(anotherPipe[0]);
dup2(anotherPipe[1], 1); //redirect stdout to pipe
close(anotherPipe[1]);
execl("/usr/bin/who", "usr/bin/who", (char*)NULL);
此外,在调用 execl
时不要忘记将 NULL
大小写为 (char*)
。由于它是一个可变参数函数,它不会自动转换类型。
我有烟斗。
int anotherPipe[2];
make(anotherPipe);
以下两个进程都可以访问此管道。
进程 A:
close(anotherPipe[0]);
dup2(anotherPipe[1], 1); //redirect stdout to pipe
execl("/usr/bin/who", "usr/bin/who", NULL);
close(anotherPipe[1]); //this is never executed
进程 B:
close(anotherPipe[1]);
read(anotherPipe[0], stringbuffer, bytestoread);
printf("%s\n", buffer);
printf("checkpoint\n");
close(anotherPipe[0]);
"who" 命令的 execl 输出通过管道重定向到进程 B,并在其中打印。但是现在我的进程 B 没有终止,尽管打印了检查点。
'not terminating' 我的意思是终端中不显示以下内容:
myusername@ubuntucomputer:~$
这里发生了什么,如何解决的?
编辑:解决了非终止进程 B 的问题。它终止了,但我的顶级进程在 A 和 B 之前完成,所以
myusername@ubuntucomputer:~$
印得早了很多。我使用了 waitpid() 现在一切正常。
如果 execl()
成功,原始程序 运行s 之后没有任何内容,因为它用您要求它 运行 的程序替换进程的内容。您需要关闭管道 before execl
:
close(anotherPipe[0]);
dup2(anotherPipe[1], 1); //redirect stdout to pipe
close(anotherPipe[1]);
execl("/usr/bin/who", "usr/bin/who", (char*)NULL);
此外,在调用 execl
时不要忘记将 NULL
大小写为 (char*)
。由于它是一个可变参数函数,它不会自动转换类型。