Linux系统中C语言编程创建函数fork()执行解析

一、Linux系统中C语言编程创建函数fork()执行解析

1. 简介

在Linux系统中,通过fork() 函数可以创建出一个子进程(child process),让子进程拥有与父进程(parent process)相同的代码和数据的副本,然后各自独立运行。它是用于创建新进程的系统调用,可以更简便地创建新进程并与该进程进行通信。

2. 语法

创建子进程的函数原型为:

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

pid_t fork(void);

函数调用成功时会返回两个值,分别是在父进程和子进程中得到的返回值,例如在子进程中返回的是0,而在父进程中则返回创建出的子进程的进程ID(process ID)。

3. 实例

实例1:父进程创建子进程,并在子进程中输出一句话。
#include <stdio.h>
#include <unistd.h>
void main() {
    pid_t pid; // pid_t是指用于进程ID号的系统数据类型
    char* message;
    int n;
    printf("fork program starting\n");
    pid = fork();
    switch (pid) {
    case -1:
        printf("fork failed\n"); // 创建失败,输出提示信息
        break;
    case 0:
        message = "This is the child process";
        n = 5;
        break;
    default:
        message = "This is the parent process";
        n = 3;
        break;
    }
    // 在父子进程中都要输出的语句
    for (; n > 0; n--) {
        puts(message);
        sleep(1);
    }
}
实例2:拓展实例1,在子进程中再次创建子进程并输出两句话。
#include <stdio.h>
#include <unistd.h>
void main() {
    pid_t pid1, pid2; // pid_t是指用于进程ID号的系统数据类型
    char* message1;
    char* message2;
    int n;
    printf("fork program starting\n");
    pid1 = fork();
    switch (pid1) {
    case -1:
        printf("fork failed\n");
        break;
    case 0:
        message1 = "This is the child process1";
        n = 2;
        pid2 = fork();// 在第一个子进程中再次fork()函数创建第二个子进程
        switch (pid2) {
        case -1:
            printf("fork failed\n");
            break;
        case 0:
            message2 = "This is the child process2";
            break;
        default:
            message2 = "This is the parent of child2";
            break;
        }
        break;
    default:
        message1 = "This is the parent process";
        n = 3;
        break;
    }
    for (; n > 0; n--) {
        if (pid1 == 0) {
            puts(message1);// 在第一个子进程中输出message1
        }
        else {
            if (pid2 == 0) {
                puts(message2);// 在第二个子进程中输出message2
            }
            else {
                puts(message1);// 在父进程中输出message1
            }
        }
        sleep(1);
    }
}

以上两个示例可以通过gcc编译器进行编译,具体命令行如下:

$gcc -o fork fork.c

然后在Linux系统终端环境中运行生成的可执行文件。

示例1输出结果: 

fork program starting
This is the parent process
This is the child process
This is the child process
This is the child process
This is the child process

示例2输出结果:

fork program starting
This is the parent process
This is the child process1
This is the child process2
This is the child process1
This is the parent of child2
This is the child process1

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux系统中C语言编程创建函数fork()执行解析 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PHP错误处理函数

    当 PHP 程序出错时,可以通过使用 PHP 错误处理机制来捕获并处理错误,PHP 为我们提供了一系列的错误处理函数来实现这一功能: 错误类型 PHP 内置了多种类型的错误,下面来简单介绍一下: E_ERROR 表示严重的错误,程序无法恢复运行,例如访问一个不存在的方法或函数 E_WARNING 表示警告信息,程序可以继续运行,但可能出现问题,例如访问一个未…

    C 2023年5月23日
    00
  • C程序 选择排序

    C程序 – 选择排序攻略 什么是选择排序? 选择排序是一种简单的排序算法。它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部待排序的数据元素排完为止。 选择排序的过程 选择排序的过程可以通过以下步骤来描述: 从序列中选择最小/最大之一的元素; 把它与待排序的数组中的第一个元素交换位置; 从剩余的元素中继续选择…

    C 2023年5月9日
    00
  • C语言版医院管理系统

    C语言版医院管理系统攻略 介绍 C语言版医院管理系统是一个完整的医院管理系统,可以实现包括病人信息管理、医生信息管理、医院排班管理、医生出诊信息管理、病历管理等多项功能。该系统可以实现对医院各种资源和信息的自由管理,方便医院管理人员的工作。 系统需求 操作系统:Windows或Linux C语言编译器:gcc或VS 操作说明 1. 运行程序 下载并解压缩医院…

    C 2023年5月23日
    00
  • C++进一步认识类与对象

    C++进一步认识类与对象 类与对象是什么? 在 C++ 中,类是一种自定义的数据类型,它可以封装数据和函数。每个类都可以实例化出多个对象,这些对象都有共同的数据类型和函数行为,称为类的实例或对象。 类的定义 定义一个类,需要确定以下内容: 类的名称 类的数据成员 类的成员函数 下面是一个简单的类的定义: class Box { public: double …

    C 2023年5月22日
    00
  • vscode 采用C++17版本进行编译的实现

    要详细讲解“vscode 采用 C++17 版本进行编译的实现”,可以按照以下步骤进行: 步骤一:安装 VS Code 和 C++ 编译器 首先需要安装 Visual Studio Code (VS Code) 和 C++ 编译器。可以选择使用 MinGW-w64 或 MSVC 编译器,这里以 MinGW-w64 为例进行说明。 步骤二:配置 VS Code…

    C 2023年5月23日
    00
  • C语言模拟实现简单扫雷游戏

    C语言模拟实现简单扫雷游戏攻略 背景知识 扫雷游戏是一款经典的单机游戏,由微软公司开发并受全球玩家喜爱。扫雷游戏的核心玩法是在矩阵区域内,通过翻开若干个格子来避免让地雷引爆,同时探索出所有非地雷格子并标记出所有已知的地雷格子。本攻略将通过C语言模拟实现简单的扫雷游戏,以帮助初学者巩固自己的C语言编程能力。 实现步骤 设计游戏地图:将游戏区域按照网格形式划分为…

    C 2023年5月24日
    00
  • C语言求阶乘之和的三种实现方法(先阶乘再累加)

    当我们需要计算n的阶乘之和时,可以采用以下三种方法进行实现: 方法一:单层for循环 在本方法中,我们可以将for循环的条件直接设为i<=n即可,每次循环计算i的阶乘并加到sum中,最后输出sum即可。 示例代码: #include <stdio.h> int main() { int n, sum=0, factorial=1; prin…

    C 2023年5月23日
    00
  • json error: Use of overloaded operator [] is ambiguous错误的解决方法

    这个错误常见于C++中使用json类型的数据。当使用json类型的数据时,如果没有包含正确的头文件并正确使用命名空间,则会出现“json error: Use of overloaded operator [] is ambiguous错误的解决方法”的错误。 以下是解决这个错误的步骤: 包含正确的头文件 在使用json数据时,必须使用正确的头文件。最常用的…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部