C 语言编程 — fork 多进程操作
创始人
2024-06-02 07:03:24

目录

文章目录

  • 目录
  • fork() 多进程
  • 多进程间控制
    • wait() 和 waitpid()
  • IPC(多进程间通信)
    • 文件描述符 IPC
    • 共享内存 IPC
  • 高并发进程池

fork() 多进程

函数作用:fork() 函数多进程编程的基础,用于新建子进程。子进程拥有自己的虚拟地址空间,并且子进程是父进程的一个副本,拥有和父进程一样的程序代码、数据、堆栈等等。父子进程之间唯一的区别在于它们拥有不同的 PID。

函数逻辑:fork() 函数被调用之后,程序会立即被分成父子两个进程,并且并行运行。所以,fork() 会特殊的返回 2 次,程序需要通过 if/else 语句来判断 2 个不同的 pid 数值,以此判断当前代码运行在父进程地址空间还是子进程地址空间。

  • 子进程可以通过 getpid() 函数获取自己的 PID,可以通过 getppid() 函数获取父进程的 PID。
  • 父进程可以通过 wait() 或 waitpid() 等函数等待子进程的退出,以便获取子进程的退出状态。
  • 父子进程间的通信需要依赖 IPC(进程间通信)机制实现。

函数原型

  • 函数返回值:pid_t 是一个有符号整数类型,表示 PID。函数返回值有 3 种情况:
    • pid > 0:对于父进程而言,返回的是子进程的 PID。表示当前代码运行在父进程地址空间。
    • pid = 0:对于子进程而言,返回 0。表示当前代码运行在子进程地址空间。
    • pid < 0:创建失败,可以通过 errno 变量获取错误码。失败的原因可能是系统资源不足,或者是进程已经创建了太多的子进程。
#include pid_t fork(void);

示例代码:通过 pid 数值判断,在 if/else 代码块中实现父子进程各自的逻辑。

#include 
#include 
#include int main() {pid_t pid;int status;pid = fork();if (pid == 0) {// 子进程中执行 ls 命令execlp("ls", "ls", "-l", NULL);printf("exec failed\n");} else if (pid > 0) {// 父进程中等待子进程结束wait(&status);printf("child process exited with status %d\n", status);} else {printf("fork failed\n");}return 0;
}

多进程间控制

wait() 和 waitpid()

IPC(多进程间通信)

文件描述符 IPC

共享内存 IPC

在 Linux 中使用 pipe 或 “FIFO 文件“ 等基于 fd(文件描述符)的 IPC 机制会有很多局限性,比如效率的问题。而共享内存 IPC 是一种基于内存访问的方式,有效率高、实现简单的优势。

Linux 提供了多种共享内存 IPC 方案,可有效减少数据拷贝的次数:

  1. mmap 内存共享映射。
  2. XSI 共享内存。
  3. POSIX 共享内存。

在这里插入图片描述

高并发进程池

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...