举例讲解C语言的fork()函数创建子进程的用法

当我们编写多进程程序时,经常需要使用fork()函数创建子进程。在此为大家详细讲解C语言的fork()函数创建子进程的用法。

什么是fork()函数?

fork()函数是一个创建进程的系统调用,调用一次生成两个进程(一个子进程和一个父进程)。两个进程都执行fork()调用后的下一条语句。这个新进程几乎与原先的进程完全一样,除了它有自己独特的进程ID,PID和PPID。

基本使用方法

在C语言中,fork()函数的原型如下:

#include <unistd.h>
pid_t fork(void);

其中,返回值为pid_t类型。如果fork()调用成功,返回值为0,表示调用进程是子进程;如果返回值大于0,表示调用进程是父进程,此返回值为子进程的进程ID;如果发生错误,返回值为-1。

下面是一个简单的例子,用来说明fork()函数是如何使用的。它创建了两个进程,一个进程执行“child process”语句,另一个进程执行“parent process”语句。

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

int main()
{
  pid_t pid;
  pid = fork();
  if (pid < 0) {
    fprintf(stderr, "fork failed\n");
    exit(-1);
  } else if (pid == 0) {
    printf("child process\n");
  } else {
    printf("parent process\n");
  }
  return 0;
}

执行结果如下:

parent process
child process

fork()调用的子进程和父进程

fork()调用后,两个进程(子进程和父进程)在fork()调用处都开始运行。子进程是父进程的一个拷贝,它有自己唯一的进程ID 。

子进程和父进程的区别在于fork()调用的返回值不同。在父进程中,fork()返回新创建的子进程的PID,在子进程中返回值为0。

可以用代码来说明:

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

int main()
{
  pid_t pid;
  pid = fork();
  if (pid < 0) {
    fprintf(stderr, "fork failed\n");
    exit(-1);
  } else if (pid == 0) {
    printf("child pid = %d, parent pid = %d\n", getpid(), getppid());
  } else {
    printf("parent pid = %d, child pid = %d\n", getpid(), pid);
  }
  return 0;
}

执行结果如下:

parent pid = 1234, child pid = 1235
child pid = 1235, parent pid = 1234

结束进程

子进程可以用exit()函数来终止自己。exit()函数中包含一个整型参数,它表示子进程的终止状态。

在子进程中,可以用以下方式来终止它自己:

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

int main()
{
  pid_t pid;
  int status;
  pid = fork();
  if (pid < 0) {
    fprintf(stderr, "fork failed\n");
    exit(-1);
  } else if (pid == 0) {
    printf("child process: pid = %d\n", getpid());
    exit(0);
  } else {
    printf("parent process: pid = %d, child pid = %d\n", getpid(), pid);
    wait(&status);
    if (WIFEXITED(status)) {
      printf("child exited normally with status %d\n", WEXITSTATUS(status));
    } else {
      printf("child terminated abnormally\n");
    }
  }
  return 0;
}

其中,wait()函数会阻塞父进程,直到子进程退出。wait()函数的参数是一个整形指针,用来存储子进程的终止状态。在本例中,我们通过WIFEXITED()和WEXITSTATUS()宏来检查子进程是否正常结束。

执行结果如下:

parent process: pid = 1234, child pid = 1235
child process: pid = 1235
child exited normally with status 0

以上就是C语言中fork()函数创建子进程的基本用法和两个示例的详细讲解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:举例讲解C语言的fork()函数创建子进程的用法 - Python技术站

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

相关文章

  • SublimeText编译C开发环境设置

    Sublime Text是一款无比优秀的文本编辑器,支持丰富的插件开发,可进行多种语言的代码编写以及开发环境设置。在这里我们将一步步教你如何设置Sublime Text编译C语言开发环境,并展示其操作示例。 安装必要的软件 在编译C语言的开发环境中,我们需要安装Mingw-w64、Sublime Text和Package Control插件管理器。首先,你需…

    C 2023年5月23日
    00
  • C++11 并发指南之Lock 详解

    C++11 并发指南之 Lock 详解 什么是 Lock Lock 是一种同步机制,用于保护共享资源以避免并发访问。当多个线程访问同一个共享资源时,Lock 可以确保每个线程在使用共享资源时都是互斥的,从而避免竞态条件(Race Condition)和内存相关的不一致性问题。 Lock 的使用方法 C++11 中提供了两种 Lock 的实现方式:std::m…

    C 2023年5月22日
    00
  • C++ Clock类模拟实现闹钟运行

    C++中的Clock类可以用于时钟和计时器的计算和管理。模拟实现一个闹钟可以借助Clock类的一些方法和属性,具体步骤如下: 1. 定义Clock类 首先需要定义一个Clock类,至少需要有开始计时、停止计时、获取当前时间等方法。 class Clock { public: void start(); // 开始计时 void stop(); // 停止计时…

    C 2023年5月23日
    00
  • windows蓝屏故障Stop:C0000135 Unknown Hard Error解决方法

    windows蓝屏故障Stop:C0000135 Unknown Hard Error解决方法 在使用 Windows 操作系统时,有时候会遇到蓝屏死机的情况,特别是在启动或进入 Windows 操作系统时。其中一种蓝屏死机错误是 “Stop:C0000135 Unknown Hard Error”,这是一个非常常见的错误类型,表示发生了未知的硬件错误。 诊…

    C 2023年5月24日
    00
  • 项目之C++如何实现数据库连接池

    下面是关于“项目之C++如何实现数据库连接池”的完整攻略。 概述 这是一个C++项目,目的是为了实现一个数据库连接池。它可以提供多个连接数据库的线程,而且每个线程都可以从连接池中获取数据库连接,使用完之后再释放回去,以便其他线程使用。 实现步骤 第一步:建立连接池类 首先,我们需要建立一个连接池类,这个类应该包含以下几个基本方法: init_connecti…

    C 2023年5月22日
    00
  • 详解C++中static的用法

    当我们在C++中定义一个对象时,每个对象都有自己的独立空间,如果一个类中定义了一个变量,那么每个对象都会生成一个该变量的实例。但在一些时候,我们希望它的内存空间只有一份而不是被复制多份,这就需要使用static。 1. static的基本用法 在C++中,static的主要作用是限制变量、函数或类的作用域。在函数内部使用static局部变量,就可以将其变成静…

    C 2023年5月22日
    00
  • 升级Win8.1后传统start开始菜单不见了如何找回

    针对“升级Win8.1后传统start开始菜单不见了如何找回”的问题,我来给出完整的攻略: 问题描述 在升级Windows 8.1之后,原本存在的传统start开始菜单不见了,这该如何找回? 解决步骤 1. 检查任务栏设置 有时传统start开始菜单的隐藏可能是由于任务栏设置所导致的。可以按照以下步骤进行设置: 鼠标右键点击任务栏,并选择“属性”选项; 在弹…

    C 2023年5月24日
    00
  • 详解C/C++高精度(加减乘除)算法中的压位优化

    详解C/C++高精度(加减乘除)算法中的压位优化 什么是高精度算法? 高精度算法(又叫大数算法)是指可以处理比计算机支持的最大数值范围更大的数值计算方法。在C/C++中,int类型变量的最大范围一般为2^31-1即2147483647,而long long型变量的最大范围一般为2^63-1即9223372036854775807。如果需要处理比这更大的数字,…

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