fork函数的简单记录

【摘要】
操作系统进程创建是理解并发的基础,fork 函数的执行顺序在不同系统上表现不一。本文记录 fork 在父进程与子进程并行执行下的输出差异。采用 C 语言编写父子进程输出字符的程序,并用 shell 脚本循环执行万次,对 Ubuntu 与 Arch 两个系统的结果进行统计。结果显示:Ubuntu 上 2150 次 abc、2147 次 acb,Arch 上 2007 次 abc、52 次 acb、90 次 bac、1 次 cab。表明输出顺序受系统进程调度影响,本质是概率事件而非固定结果。
关键词:fork、进程调度、C语言、Ubuntu、Arch

关于操作系统fork的记录

由于fork()出来的子进程与父进程时并行执行的,所以在父进程结束后子进程还有可能存在(如果不让父进程等待子进程结束的话)

单次执行的代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
    int p1,p2;
    while((p1=fork())==-1);
    if(p1==0){
        putchar('b');
    }else{
        while((p2=fork())==-1);
        if(p2==0){
            putchar('c');
        }else{
            putchar('a');
        }
    }
    return 0;
}

由于不会在c里面写多次执行的方法,所以改用shell脚本调用可执行文件

for((a=0;a<10000;a++))
do
        ./a.out
        sleep 1
        echo -e "\n"
done

sleep主要是为了等本程序子进程执行完,不留到下一程序输出,测试一下还是有用的

ubuntu结果:

2150
    2 abc
 2147 acb
    1 bac
    1 bca

arch结果:

2150
2007 abc
  52 acb
  90 bac
   1 cab

结论:主要是系统的进程调度问题,在不同系统里面出现不同结果,是一个概率事件呢...我之前还以为是固定的=.=


【小结】
本文围绕 fork 函数的执行顺序展开,主要结论:第一,fork 后父子进程并行执行,输出先后取决于调度;第二,同一程序在 Ubuntu 与 Arch 上结果分布差异显著,并非固定模式;第三,shell 脚本循环万次的统计证明这是概率事件。这些结果表明,进程调度具有不确定性,对理解并发程序行为有参考价值。
posted @ 2026-09-20 15:10  兔子春  阅读(4)  评论(0)    收藏  举报