我有一个C程序,它派生了一个子进程,我从linux shell运行该进程。
我的问题是,在分叉之后,父进程移动到shell后台。我希望父进程保持在前台。
这里有一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int i;
for (i = 0; i < 3; i++) {
printf("Before Forkn");
sleep(1);
}
printf("forking...n");
pid_t pid = fork();
if (pid) {
// child
printf("Child started and now exitingn");
exit(EXIT_SUCCESS);
}
// parent
wait(NULL);
for (i = 0; i < 3; i++) {
printf("After Forkn");
sleep(1);
}
return 0;
}
输出(稍后添加注释)
Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
gregp@gregp-ubuntu:~/fork_example$ After Fork # <--- User returned to shell
After Fork
请注意,在fork之后不久,用户将返回到shell提示符,程序将继续在后台运行。我不希望发生这种事。我希望程序继续在前台运行。
所需输出(稍后添加注释)
Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
After Fork
After Fork
# Program now exits and user returns to shell
gregp@gregp-ubuntu:~/fork_example$
th pid在父级中返回,因此您的条件应该是
if (!pid)
因为你代码中的子代码不会去if。这是因为
成功时在父进程中返回子进程的PID,并且在子级中返回0。失败时,在中返回-1如果是父进程,则不创建子进程,并且正确设置了errno。
fork()在成功时将0返回给子进程。
当条件为零时,若循环将不执行。
所以,如果孩子想执行,你必须将if条件更改为
if(!pid)
更多详细信息人叉
初始问题
你需要绕着wait()
转一圈。正如所写的,它等待一个子进程完成(忽略返回的PID,不设置状态)。shell的wait
命令与系统调用不同,但代码看起来就像是通过与shell的命令进行类比而编写的。
直接问题
首先由他人识别--请他们获得信用
只有在修复了if (pid)
测试之后,wait()
循环问题才相关。。。我想知道如果你写if (pid == 0) { // Child
,你会不会搞错了?可能不会;您知道fork()
将子对象的PID返回给父对象,并将零返回给子对象。明确会有所帮助。