当前位置: 首页 > backend >正文

C语言中的进程、线程与进程间通信详解

目录

引言

基本概念

1. 进程(Process)

2. 线程(Thread)

线程编程实战

1. 常见线程库

2. 合理设置线程数

3. pthread 创建线程

线程同步机制

1. 互斥锁 pthread_mutex_t

2. 条件变量 pthread_cond_t

3. 读写锁 pthread_rwlock_t

进程的创建与控制

1. fork

2. exec

3. system

4. popen 管道读取输出

进程间通信 IPC 详解

1. 方式对比表:

2. 信号 signal

3. 共享内存 POSIX

总结


引言

本文深入探讨了 C 语言中多线程编程、进程间通信(IPC)机制的底层实现,涵盖线程同步、信号量、互斥锁、共享内存等关键知识,并通过实际任务案例带你走进操作系统世界中的“线程宇宙”

基本概念

1. 进程(Process)

程序的一次执行过程,是操作系统进行资源分配的最小单位。

  • 一个程序至少有一个进程。

  • 每个进程有自己的 地址空间资源集合执行上下文

进程分类:

  • 前台进程

  • 后台进程

  • 服务进程(如守护进程)

运行在服务器上一般都是守护进程。

2. 线程(Thread)

线程是进程中独立的执行单元,是程序执行的最小单位。

  • 一个进程至少有一个主线程(main thread)。

  • 多个线程共享该进程的地址空间和资源。

  • 线程拥有自己的 栈空间寄存器上下文

线程编程实战

1. 常见线程库

  • POSIX Thread:pthread(C语言中最常用)

  • OpenMP:并行处理,适合 C/C++

  • C++11 std::thread(不在本文范围)

2. 合理设置线程数

// CPU 密集型:核心线程数 ≈ CPU数 + 1
// IO 密集型:核心线程数 ≈ ((线程等待时间 / 线程CPU时间) + 1) * CPU数

3. pthread 创建线程

#include <pthread.h>void *thread_func(void *arg) {printf("This is a new thread\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, NULL);  // 等待线程结束return 0;
}

线程同步机制

线程同时访问共享资源时容易引发竞态条件,需进行同步。

1. 互斥锁 pthread_mutex_t

  • pthread_mutex_init

  • pthread_mutex_lock

  • pthread_mutex_unlock

  • pthread_mutex_destroy

2. 条件变量 pthread_cond_t

用于线程间等待与唤醒的机制。

pthread_cond_t cond;
pthread_mutex_t mutex;pthread_cond_init(&cond, NULL);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);     // 释放锁并阻塞
pthread_cond_signal(&cond);           // 唤醒一个线程
pthread_mutex_unlock(&mutex);

3. 读写锁 pthread_rwlock_t

适用于读多写少的场景。

pthread_rwlock_t rwlock;
pthread_rwlock_init(&rwlock, NULL);pthread_rwlock_rdlock(&rwlock);  // 读锁
pthread_rwlock_unlock(&rwlock);pthread_rwlock_wrlock(&rwlock);  // 写锁
pthread_rwlock_unlock(&rwlock);

进程的创建与控制

1. fork

克隆当前进程,创建子进程。

pid_t pid = fork();
if (pid == 0) {// 子进程
} else {// 父进程
}

2. exec

用新程序替换当前进程的映像。

execl("/bin/ls", "ls", "-l", NULL);

3. system

执行 shell 命令,本质是 fork + exec 的封装。

system("ls -l");

4. popen 管道读取输出

进程间通信 IPC 详解

1. 方式对比表:

方式特点是否跨进程是否阻塞适用场景
管道简单易用父子进程
信号异步通知机制异常处理
信号量原子性控制多进程同步
共享内存访问速度最快大数据共享
消息队列异步通信有序通信
套接字网络/本地通信是/否客户端/服务端通信

2. 信号 signal

#include <signal.h>void handler(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handler); // 注册 ctrl+C 的信号处理while (1) pause();
}

3. 共享内存 POSIX

#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>int fd = shm_open("/shm_name", O_CREAT | O_RDWR, 0666);
ftruncate(fd, 4096);
void *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);// 写入共享内存
strcpy((char*)ptr, "Hello from shared memory");munmap(ptr, 4096);
close(fd);
shm_unlink("/shm_name");

总结

通过本文的学习,我们系统掌握了 C 语言中进程与线程的基本概念、线程创建与同步的编程方法,以及多种进程间通信(IPC)机制,包括信号、共享内存、信号量等。进程负责资源的独立管理,线程则提供更轻量级的并发执行方式;同步机制确保了多线程环境下数据的一致性,而 IPC 则使得多个进程间能够高效协作与通信。结合实际案例,我们不仅加深了对操作系统底层原理的理解,也提升了并发编程与系统开发的能力。对于从事系统编程、服务器开发或学习操作系统的同学,这些内容都是必不可少的核心知识。

更多代码可以观看:Niuer_C: C语言学习 0711-0721

http://www.xdnf.cn/news/17108.html

相关文章:

  • 前端UI组件库
  • XXL-JOB快速入门
  • 【数据分享】西藏土壤类型数据库
  • imx6ull-驱动开发篇11——gpio子系统
  • 大模型客户端工具如Cherry Studio,Cursor 配置mcp服务,容易踩的坑,总结
  • 力扣经典算法篇-44-组合总和(回溯问题)
  • 进程管理块(PCB):操作系统进程管理的核心数据结构
  • NineData 新增支持 AWS ElastiCache 复制链路
  • 开疆智能ModbusTCP转Profinet网关连接安川YRC1000机器人配置案例
  • Effective C++ 条款25:考虑写出一个不抛异常的swap函数
  • 每日任务day0806:小小勇者成长记之收获日
  • NAT转化
  • Knife4j:实时接口文档的利器
  • PyTorch生成式人工智能(26)——使用PyTorch构建GPT模型
  • 学习 Android (十六) 学习 OpenCV (一)
  • 基于PHP的论坛社交网站系统开发与设计
  • Spring Boot 参数校验全指南
  • [滑动窗口]904. 水果成篮
  • 基于PHP的快递管理系统的设计与实现
  • 【动态规划 | 01背包】动态规划经典:01背包问题详解
  • C++线程中 detach() 和 join() 的区别
  • FPGA学习笔记——VGA彩条显示
  • AVDTP Media Packet 传输全流程解析:从 SDP 到连接终止
  • 从 0 到 1 创建 InfluxDB 3 表:标签、字段、命名规范一篇讲透
  • X86-ubuntu22.04远程桌面只有1/4无法正常操作
  • C++实现线程池(5)计划线程池
  • python学智能算法(三十四)|SVM-KKT条件回顾
  • KGF75N65KDF-U/H KEC 集成电路IC 工业电机驱动
  • 加密视频流程教程分享
  • 移动商城平台适配:ZKmall开源商城鸿蒙 / 小程序端开发要点