第十八章:并发程序的基本实现( 多进程 )
前言
Linux 是多道处理系统,当然能够在同一段时间内处理多个程序。
本文将介绍具体该如何操作。
fork 函数
此函数的作用是创建一个子进程,调用后,调用进程和创建的新进程就会并发执行( 从调用处开始 )。它调用一次,却返回两次,一次是在调用进程内,返回子进程ID,另一次是在创建的新进程( 子进程 )内,返回 0。
函数的具体说明请参阅相关文档。
并发代码框架
1 #include <stdio.h> 2 #include <unistd.h> 3 4 int main (void) { 5 6 int pid; 7 8 if ((pid = fork()) == 0) { 9 10 /* 11 * 此处填写子进程代码 12 */ 13 14 } 15 else if (pid < 0) { 16 17 /* 18 * 此处填写错误处理代码 19 */ 20 21 } 22 else { 23 24 /* 25 * 此处填写父进程代码 26 */ 27 28 } 29 30 return 0; 31 }
代码实现
此程序将让两个进程交替的每隔 1 秒打印它们的各自进程 ID:
1 #include <stdio.h> 2 #include <unistd.h> 3 4 int main (void) { 5 6 int pid; 7 8 if ((pid = fork()) == 0) { 9 while (1) { 10 sleep(1); 11 printf("I am %d \n", getpid()); 12 } 13 } 14 else if (pid < 0) { 15 printf("创建子进程失败\n"); 16 return 1; 17 18 } 19 else { 20 while (1) { 21 sleep(1); 22 printf("I am %d \n", getpid()); 23 } 24 } 25 26 return 0; 27 }
运行测试
小结
1. 本文讲述的是最简单最基本的并发实现,很多更复杂的并发实现都是基于这个框架的。
2. 如果要确保子进程先运行,并且在启动子进程后立马 exec 一个新程序的话,请将 fork 换成 vfork。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步