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日

相关文章

  • QQ飞车TP警告码0 5 540 游戏环境异常解决方法

    QQ飞车TP警告码0 5 540 游戏环境异常解决方法 问题描述 在QQ飞车游戏中,当出现TP警告码0 5 540时,表示游戏环境存在异常,需要进行修复处理。以下是该问题的解决方法。 解决步骤 步骤一:检查电脑配置 首先需要检查电脑配置是否达到了游戏运行要求,包括操作系统版本、CPU、内存等硬件配置,确保满足游戏要求。 步骤二:删除游戏文件 如果电脑配置满足…

    C 2023年5月22日
    00
  • 教你使用MySQL Shell连接数据库的方法

    下面是关于“教你使用MySQL Shell连接数据库的方法”的完整攻略。 1. 下载和安装 MySQL Shell MySQL Shell可以从Mysql官网下载,下载完成后,根据操作系统类型进行安装。 2. 连接服务器 使用MySQL Shell连接数据库需要以下信息: IP地址或主机名 端口 用户名 密码 下面是连接服务器的示例: mysqlsh roo…

    C 2023年5月23日
    00
  • C语言 动态内存分配的详解及实例

    C语言 动态内存分配的详解及示例 什么是动态内存分配 在编程中,有时我们需要根据实际情况动态地分配内存空间,而不是在编写时就预先分配好。这种内存分配方式被称为动态内存分配。动态内存分配可以避免预分配内存的浪费,同时还可以根据需要扩充内存。 C语言中提供了四个用于动态内存分配的库函数,分别是 malloc、calloc、realloc 和 free。 mall…

    C 2023年5月23日
    00
  • C语言宏定义容易认不清的盲区梳理

    C语言宏定义容易认不清的盲区梳理 在C语言中,宏定义可以方便地定义一些常量、变量、函数等。然而,在使用宏定义时也有一些容易混淆的盲区,这里给出一些梳理。 1. 宏定义和函数定义的区别 宏定义和函数定义都可以定义函数(或函数形式的代码块),但二者存在明显的区别。 宏定义直接将定义的字符串替换到代码中,而函数需要调用才能执行。 #define SQUARE(x)…

    C 2023年5月23日
    00
  • C语言结构体释放问题

    C语言中的结构体是一种自定义的数据类型,相对于其他基本数据类型,结构体可以描述更为复杂的数据结构。在程序中,我们通常需要申请、初始化、使用和释放结构体变量,其中释放结构体变量所占用的内存空间是非常重要的一步。本文将详细讲解C语言结构体释放问题的完整使用攻略,让读者能够正确地使用结构体并避免内存泄漏问题。 申请和释放结构体空间的注意点 在C语言中申请和释放结构…

    C 2023年5月9日
    00
  • Go语言中读取命令参数的几种方法总结

    Go语言中读取命令参数的几种方法总结 在Go语言的程序中,读取命令参数是一个必要的操作。本文会总结出Go语言中读取命令参数的几种方法,并提供示例说明。 1. 通过os包读取命令行参数 在Go语言中,我们可以使用os.Args变量来获取命令行参数。os.Args是一个字符串切片,其中第一个元素是程序的名称,后面的元素是传递给程序的命令行参数。 以下是一个简单的…

    C 2023年5月22日
    00
  • 10行C++代码实现高性能HTTP服务

    10行C++代码实现高性能HTTP服务 介绍 在这里,我们将探讨如何使用简单的C++代码来实现一个高性能的HTTP服务,这里的代码非常的短,总共只有10行。本攻略将提供两个示例来展示如何使用这个简短的C++代码。 基本思路 这里的基本思路是使用socket编程来处理HTTP请求和响应。使用C++语言写socket程序需要包含头文件 和 ,并使用零拷贝技术来实…

    C 2023年5月23日
    00
  • C++面向对象编程之析构详解

    C++面向对象编程之析构详解 概述 在C++面向对象编程中,析构函数是一种特殊的成员函数,它在对象被销毁时调用。析构函数通常用于在对象被销毁前,释放对象所占用的资源,如动态分配的内存空间、文件句柄等。 析构函数的函数名与类名相同,但前面加上 “~” 符号,且析构函数没有返回值和参数。 class MyClass { public: MyClass(); ~M…

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