我想运行一些简单的例子来了解fork()系统调用是如何工作的。
它的工作但需要在打印后按回车键退出程序child process。
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == 0){
printf("child process\n");
}
else{
printf("parent process\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ss@ss:~$ gcc dd.c -o dd
ss@ss:~$ ./dd
parent process
ss@ss:~$ child process
Run Code Online (Sandbox Code Playgroud)
在屏幕程序上打印子进程后,需要按回车键返回终端。
终端等待输入新命令,如果只是按回车返回,写
ss@ss:和确定。
或者我们可以输入任何其他终端命令并执行。
我想知道为什么会发生这种行为,如果打印后程序真的完成了child process为什么终端不显示ss@ss:~$
这是我的机器信息
gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Run Code Online (Sandbox Code Playgroud)
uname -a
Linux ss 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:41 UTC 2017 i686 i686 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
编辑
除了Felix Guo 的回答wait(NULL)之后printf("Parent process"),还强制父进程等待子进程。
我找到它的另一种方式,从通过重定向程序的输出以任意文件>的码头运营商。
在执行命令中:
./dd > out.txt
Run Code Online (Sandbox Code Playgroud)
它将输出重定向到 out.txt 文件。如果我们 cat 这个文件:
$cat out.txt
parent process
child process
Run Code Online (Sandbox Code Playgroud)
这是另一种查看程序正确输出的方法fork()。
[编辑 2]
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == 0){
printf("child process: \n\t");
printf("PID: %d\n\tPPID: %d\n", getpid(), getppid());
}
else{
printf("parent process: \n\t");
printf("PID: %d\n\tPPID: %d\n", getpid(), getppid());
wait(NULL);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
parent process:
PID: 4344
PPID: 4336 < --- OS
child process:
PID: 4345
PPID: 4344 < --- parent process
Run Code Online (Sandbox Code Playgroud)
您的父进程在等待子进程完成之前退出,因此父进程将完成,这就是终端正在等待的,因此终端将返回其命令输入状态,从而输出ss@ss.... 然后你的孩子处理打印并刷新stdout到屏幕,然后输出child process到终端,但由于终端已经输出了 prompt ss@ss,它在提示之后结束。
解决这个问题的方法是return 0在父进程之前等待子进程退出。您可以使用wait(NULL)afterprintf("Parent process")等待子进程,如下所述:让父进程等待所有子进程