多进程控制:
进程简单点说就是一个正在运行的程序。
进程是系统中资源分配的最小单位,进程拥有自己的代码段,数据段和堆栈段。
程序与进程的区别:
程序可以文件的形式保存在内存中(占用存储器的内存)、
而进程只能运行于系统内存中、
一个程序可以对应多个进程。
进程具有并发性:在同一个时间段,可以有多个进程运行。
多个进程从宏观上看是同时执行的,但是从微观上说,由于CPU同一时刻一次只能执行一个进程对应的代码,
所以说这些进程是交替运行的,并发执行使得CPU在这些进程之间进行快速的切换,让用户感觉是同时运行的。
但是这种切换是没有规律得,哪个进程抢到时间片,cpu则运行哪个进程。
时间片是linux的一种进程调度方式。
进程之间可以相互制约,使得进程之间具有间隙。---使用sleep(挂起)可以调节顺序
进程的状态分为就绪状态、执行状态、阻塞状态。
ps –aux查询当前系统下(进程的状态)或ps –ef ---查询当前系统下(父子进程关系)
R:表示正在运行的进程
S:表示阻塞状态
T:表示暂停状态 ---通过ctrl+z可以进入暂停状态 fg可以返回暂停的进程里面
Z:进程运行结束未被收回—僵尸状态
I:表示多进程
+:表示后台运行的进程组
进程0是系统级进程,1号进程为祖先进程,所有进程都是从祖先进程继承过来的。"1生万物"
kill -9 进程id(pid) 可以杀死进程
创建进程函数:pid_t fork(void); pid_t就是一个int类型的数据
功能:创建一个子进程
返回值:在父进程中,用fork返回新创建子进程的进程ID
在子进程中,fork函数返回值为0
失败的话返回 负值
在程序中调用了fork()就会创建一个子进程,
子进程会复制调用fork()之前的用户空间(堆区、栈区、常量区、静态区)。
并且这些资源不是初始化的状态,而是处于栈区的状态。
可以通过exit()销毁进程,wait(NULL)来等待。
父子进程框架(本人常用):
pid = fork(); //创建一个子进程,主进程就是父进程
if(pid < 0)//异常处理
{
perror("创建进程失败\r\n");
return 0;
}
if(pid == 0) //子进程要做的事
{
while(1)
{
}
exit(0);
}
else if(pid > 0) //父进程要做的事
{
while(1)
{
}
wait(NULL); //等待子进程结束,再结束父进程
}
进程的阻塞也可以通过秒级睡眠sleep(),与微秒级睡眠usleep()实现;