使用fork()创建子进程并观察运行结果

本文将通过两个简单的C语言程序示例,演示使用fork()系统调用创建子进程,并对运行结果进行分析。

示例1:单个字符输出

代码:

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid1, pid2;
    pid1 = fork();
    if (pid1 < 0) {
        printf("fork error");
    } else if (pid1 == 0) {
        printf('c\n');
    } else {
        pid2 = fork();
        if (pid2 < 0) {
            printf("fork error");
        } else if (pid2 == 0) {
            printf('b\n');
        } else {
            printf('a\n');
        } 
    }
    return 0;
}

运行结果:

由于进程调度的不确定性,输出结果可能会有不同。但是大多数情况下,输出结果应该是:

b
c
a

原因:

  • 父进程先执行,输出'a',然后创建了两个子进程。
  • 其中一个子进程先执行,输出'b',另一个子进程紧接着执行,输出'c'。

示例2:循环输出字符串

代码:

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid1, pid2;
    pid1 = fork();
    if (pid1 < 0) {
        printf("fork error");
    } else if (pid1 == 0) {
        while (1) {
            printf('daughter ...\n');
            sleep(1);
            printf('son ...\n');
            sleep(1);
        }
    } else {
        while (1) {
            printf('parent ...\n');
            sleep(1);
        }
    }
    return 0;
}

运行结果:

由于进程调度的不确定性,输出结果可能会有不同。但是大多数情况下,输出结果应该是:

parent ...
daughter ...
parent ...
son ...
parent ...
daughter ...
parent ...
son ...
...

原因:

  • 父进程先执行,创建了两个子进程。
  • 子进程进入死循环,一直输出自己的名字,每次输出后等待1秒钟。
  • 父进程也进入死循环,一直输出自己的名字,每次输出后等待1秒钟。
  • 由于进程调度的不确定性,每个进程的输出顺序可能不同,但是每个进程的输出都会持续不断地进行。

总结:

通过这两个示例,我们可以了解到使用fork()系统调用创建子进程的基本方法,以及进程调度机制导致的运行结果的不确定性。在实际应用中,需要根据具体需求进行合理的代码设计,以确保程序能够按照预期执行。

C语言fork()系统调用创建子进程示例及运行结果分析

原文地址: https://www.cveoy.top/t/topic/kFtQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录