c - 程序如何控制fork调用之间的切换

标签 c unix fork system system-calls

我最近开始了解 fork() 系统调用,并且编写了下面的程序。 我对下面的程序的疑问在于它的输出。为什么程序只打印父 printf 的前十行,然后移至子 printf 中的打印语句,并再次移回父 printf 中的打印语句。这是如何工作的?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    pid_t newpid;
    int i =0;

    newpid=fork();
    if(newpid==0)
    {
        for(i=0;i<10;i++)
        {
            printf("child process pid %d number %d \n", newpid,i);
        }
    }
    else
    {

        for(i=0;i<20;i++)
        {
            printf("parent process pid %d number %d \n", newpid,i);
        }

    }
    return 0;
}

输出:

parent process pid 9224 number 0
parent process pid 9224 number 1
parent process pid 9224 number 2
parent process pid 9224 number 3
parent process pid 9224 number 4
parent process pid 9224 number 5
parent process pid 9224 number 6
parent process pid 9224 number 7
parent process pid 9224 number 8
parent process pid 9224 number 9
child process pid 0 number 0
parent process pid 9224 number 10
parent process pid 9224 number 11
parent process pid 9224 number 12
parent process pid 9224 number 13
parent process pid 9224 number 14
parent process pid 9224 number 15
child process pid 0 number 1
parent process pid 9224 number 16
child process pid 0 number 2
parent process pid 9224 number 17
child process pid 0 number 3
parent process pid 9224 number 18
parent process pid 9224 number 19
child process pid 0 number 4
child process pid 0 number 5
child process pid 0 number 6
child process pid 0 number 7
child process pid 0 number 8
child process pid 0 number 9

最佳答案

通过 fork(),您完全创建了一个具有自己的地址空间的新进程。这是子进程。 parent 是创造 child 的人。但它们共享相同的代码和输出终端。它们由操作系统独立调度来运行。因此,您无法预测 parent 打印和 child 打印的顺序。而且它们肯定不会按顺序排列,这就是您看到打印交错的原因。

关于c - 程序如何控制fork调用之间的切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127363/

相关文章:

c++ - 如何编写可移植的 simd 代码以实现复杂的乘法归约

c - 将 C 字符串解析为数字和运算符

c - C语言程序无法打开txt文件

java - Windows 和 Unix 之间的 ZoneDateTime 精度差异

r - R中的多核和data.table

c - fork() 语句中的进程数量(包括程序)

python - 复制列表时多处理 : why is a numpy array shared with the child processes,?

将值写入其他变量后,C 在函数中释放 int 数组

linux - 检查用户输入的格式是否正确

使用标准 I/O 和系统调用制作文件副本的 C 程序