问题描述
使用管道时是否需要将stdin
替换为pipe
结尾?
我有一个应用程序:-
创建管道, 派生一个子进程,然后 execl()新子进程中的新进程映像,但我遇到了两个概念性问题。
是否需要用dup()
或dup2()
替换stdin
?显然,只使用管道中的fd
会更容易。(我不需要对此有什么了解)
如果您只能使用管道中的fd
,当execl采用char *
参数时,如何使用execl()
传递整数fd
?
我很难弄清楚在执行execl()之后什么仍然是打开的,以及如何从新执行的进程访问该信息。
推荐答案
您可能正在尝试将数据馈送到系统上存在的子进程,但如果您也在写入子进程,则不需要使用dup()
和stdin
。
execl()
使父进程中所有打开的文件描述符保持打开状态,以便您可以:
int fd[2];
pipe(fd);
if (fork() == 0)
{
char tmp[20];
close(fd[1]);
snprintf(tmp, sizeof(tmp), "%d", fd[0]);
execl("client", tmp, NULL);
exit(1);
}
在客户端的代码中:
int main(int argc, char** argv)
{
int fd = strtod(argv[1], NULL, 10);
/* Read from fd */
}