实现C多进程要先了解一系列的相关函数和相关概念
1.进程相关概念
1.1程序和进程:
程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)
进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)
程序 → 剧本(纸) 进程 → 戏(舞台、演员、灯光、道具…)同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)
如:同时开两个终端。各自都有一个bash但彼此ID不同。
1.2并发
并发,在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点上仍只有一个进程在运行。
例如,当下,我们使用计算机时可以边听音乐边聊天边上网。 若笼统的将他们均看做一个进程的话,为什么可以同时运行呢,因为并发分时复用cpu。
1.3进程状态
进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。
2.相关函数
2.1getenv函数
获取环境变量值
char *getenv(const char *name);
成功:返回环境变量的值;失败:NULL (name不存在)
2.2setenv函数 设置环境变量的值 int setenv(const char *name, const char *value, int overwrite); 成功:0;失败:-1 参数overwrite取值: 1:覆盖原环境变量 0:不覆盖。(该参数常用于设置新环境变量,如:ABC = haha-day-night)
2.3unsetenv函数 删除环境变量name的定义 int unsetenv(const char *name); 成功:0;失败:-1 注意事项:name不存在仍返回0(成功),当name命名为"ABC="时则会出错。
进程控制
2.4fork函数 创建一个子进程。 pid_t fork(void); 失败返回-1;成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 pid_t类型表示进程ID,但为了表示-1,它是有符号整型。(0不是有效进程ID,init最小,为1) 注意返回值,不是fork函数能返回两个值,而是fork后,fork函数变为两个,父子需【各自】返回一个。
循环创建n个子进程 一次fork函数调用可以创建一个子进程。那么创建N个子进程应该怎样实现呢? 简单想,for(i = 0; i < n; i++) { fork() } 即可。但这样创建的是N个子进程吗? 显然不是的,查看下图:
循环创建N个子进程从上图我们可以很清晰的看到,当n为3时候,循环创建了(2^n)-1个子进程,而不是N的子进程。需要在循环的过程,保证子进程不再执行fork ,因此当(fork() == 0)时,子进程应该立即break;才正确。
练习:通过命令行参数指定创建进程的个数,每个进程休眠1S打印自己是第几个被创建的进程。如:第1个子进程休眠0秒打印:“我是第1个子进程”;第2个进程休眠1秒打印:“我是第2个子进程”;第3个进程休眠2秒打印:“我是第3个子进程”。
代码实例:
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
void fork_Demo()
{
for(int i = 0; i < 10; i++)
{
if(fork()