如何重定向 fork() 创建的子进程的 IO 并使用 exec() 函数?

Posted

技术标签:

【中文标题】如何重定向 fork() 创建的子进程的 IO 并使用 exec() 函数?【英文标题】:How to redirect the IO of child process created by fork() and uses exec() function? 【发布时间】:2012-11-03 06:19:17 【问题描述】:

我正在用 C 语言编写一个 Shell。用户应该能够执行各种命令并使用管道(|)将一个命令的输入重定向到另一个命令。主 shell 进程是父进程,并为每个命令派生新进程,在子进程中,该命令由 exec*() 函数调用。

但我不知道如何将一个子进程的标准输入/输出重定向到另一个子进程。

【问题讨论】:

【参考方案1】:

也许这对你有帮助....

int f=open(somefile, O_WRONLY | O_CREAT, S_IRWXU);
dup2(f,1);  //redirecting output to file
//execute your first command here using fork
close(f);
int f=open(somefile, O_RDONLY | O_CREAT, S_IRWXU);
dup2(f,0);    //this will give the ouput of the first command to stdout 
//i.e. the input is present for second one
//execute your second command here
close(f);

【讨论】:

在第二次调用 dup2 时,在评论中,我猜它是标准输入而不是标准输出。 有没有比文件更好的方法?我可以使用管道或任何其他 IPC 机制吗?最后,如何将该文件描述符“1”设置回标准输出? 是的,它应该是标准输入。如果您希望将第二个进程的输出打印在标准输出上,则不需要这样做

以上是关于如何重定向 fork() 创建的子进程的 IO 并使用 exec() 函数?的主要内容,如果未能解决你的问题,请参考以下文章

高级IO中socketpair实现进程间通信以及重定向

如何在最后一个子 fork() 下打印带有名称和 pid 的子进程

3.OS-Virtualization|进程API

当父进程被杀死时,使用 fork() 创建的子进程是不是会自动被杀死?

在子进程中重定向 STDOUT

(疑问)进程控制---vfork 函数