ubuntu下C的多进程的简单实现

实现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() 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值