以最简单的形式使用 fork() 需要按 Enter 完成执行

Esm*_*elE 1 c fork pid

我想运行一些简单的例子来了解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)

Fel*_*Guo 6

您的父进程在等待子进程完成之前退出,因此父进程将完成,这就是终端正在等待的,因此终端将返回其命令输入状态,从而输出ss@ss.... 然后你的孩子处理打印并刷新stdout到屏幕,然后输出child process到终端,但由于终端已经输出了 prompt ss@ss,它在提示之后结束。

解决这个问题的方法是return 0在父进程之前等待子进程退出。您可以使用wait(NULL)afterprintf("Parent process")等待子进程,如下所述:让父进程等待所有子进程