进程 :是一个动态空间(从程序的开始执行(创建进程),直到程序结束),也就是程序的一次执行过程。进程还有其他名称:
1、可以独立参与调度的任务
2、申请资源和释放资源的总称
进程与程序的区别
程序:程序是静态的,只是存在于磁盘上的命令的集合
进程:进程是动态的,负责程序的创建、调度、执行、消亡(释放)等过程。
进程管理器(负责向内核进行空间的申请资源)
进程号(PID)
进程分类:
1、交互进程(前后台进程)
由Shell控制和允许,可以是前台进程,也可以是后台进程。
后台进程:程序中主循环内的程序,无优先级一直循环工作的程序。
前台进程:程序中发生中断不执行当前循环内的程序,而是执行中断程序。
2、批处理进程(一次性处理多个进程)
进程不属于终端,一次性处理多个任务,提交到一个队列顺序执行
3、守护进程
一般在后台执行,属于一种特殊的任务(进程)。一般开机执行,关机结束
系统管理
进程的执行状态
1、就绪态(运行态):
2、等待态(): 进程正在等待某个事件产生或某个资源,才可以执行(可中断与不可中断)
3、停止态: 进程被中止
4、僵尸态(死亡态):这时,是一个终止状态,等待资源回收而已
进程的模式
用户模式和内核模式。
用户模式既自己写的程序,内核模式则是调用内核的程序。
进程执行
在Linux中,如果要执行一个程序,变为进程(创建进程),需要依靠其他正在执行的进程,创建进程需要其他进程。
被创建的进程叫做子进程,去执行创建的进程叫做父进程(一个执行程序调用其他函数库,执行程序为父进程,而调用的函数库为子进程)
以下是创建父子进程所需要的函数
1、fork()创建函数
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
创建的子进程,从fork()后面开始运行,父进程执行全部程序,创建子进程会有返回值
返回值: pid_t
成功:在父进程中返回子进程的pid号,在子进程中返回0.
失败:在父进程中 -1
2、获得当前进程的pid号
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);//返回当前执行进程的pid
pid_t getppid(void);//返回当前执行进程的父进程的pid
3、结束当前进程
结束当前进程
#include <stdlib.h>
void exit(int status);====等价于 main函数 return xxx;
#include <unistd.h>
void _exit(int status);
参数:
参数1:int status//:结束状态,表示当前进程的结束状态,把结束状态提供给父进程
区别:exit会在结束进程,把所有文件的缓冲区刷新,_exit结束就是直接结束
4、等待进程结束
#include <sys/types.h>
#include <sys/wait.h>
//等待任意的子进程结束,哪个子进程结束就回收谁,获取子进程的结束状态
pid_t wait(int *wstatus);
参数:
参数1:int *wstatus//:指针,地址,把子进程的结束状态存储到这个地址中,如果不需要子进程的结 束状态,参数写NULL
返回值:pid_t
成功:返回等待到的结束子进程的pid
失败:错误 返回-1
pid_t waitpid(pid_t pid, int *wstatus, int options);
参数:
参数1:pid_t pid//:等待哪个子进程 -1:等待任意子进程 >0:等待指定值为pid的进程
参数2:int *wstatus//:指针,地址,把子进程的结束状态存储到这个地址中,如果不需要子进程的结 束状态,参数写NULL
参数3:int options://选项
WNOHANG:非阻塞等待,如果当前有子进程结束就回收,如果在执行waitpid时没有子进程结 束,函数就立即结束不等待
0:阻塞等待,一直阻塞等待有子进程结束
例程:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid = 0;
pid = fork();
if(pid == 0)
{
printf("1 child\n");
sleep(4);
printf("1 pid %d\n",getpid());
exit(0);
}
else if(pid > 0)
{
pid = fork();
if(pid == 0)
{
printf("2 child\n");
sleep(2);
printf("2 pid %d\n",getpid());
exit(0);
}
}
printf("this is parent\n");
sleep(5);
pid = waitpid(-1,NULL,WNOHANG);
printf("child pid is %d\n",pid);
return 0;
}
执行结构为
this is parent
2 child
1 child
2 pid 36105
1 pid 36104
status is 100
child pid is 36104