目录
前言
一、创建进程
二、退出进程
void exit (int retval)
三、进程等待
四、进程替换
前言
提示:这里可以添加本文要记录的大概内容:
前面我们认识了进程,现在让我们认识几个进程的接口
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建进程
接口
pid_t fork(void)
功能:通过复制父进程创建一个子进程
返回值:对于父进程返回子进程的pid,对子进程成功返回0,失败返回-1;
特点:父子进程,数据独有、代码共享。
数据独有,代码共享
创建一个进程pcb,pcb中有一个指针指向虚拟地址空间(内存指针),指向的所以地址都会同页表映射到物理内存中,而代码中的g_val通过映射在物理内存中存储数据,当我们创建子进程,它就会复制子进程,它就会复制父进程(复制了所有的地址,映射关系,页表,若子进程修改g_val的数据,那么他会生成一个新的数据放到物理内存中,若不修改继续使用父进程的数据)。
目的:提高子进程的创建效率、节省了空间内存的申请与大量数据拷贝的过程。
接口
pid_t vfork(void);
创建出了的子进程与父进程共用一个虚拟地址空间与fork相比较少了拷贝,提高了效率缺点
父进程调用vfork创建了子进程后会阻塞、只有等到子进程exit退出,或子进程进行了程序替换(程序替换后子进程会有自己的虚拟地址空间,页表等)
二、退出进程
退出进程的三种方法
1:在main函数中return ;
2:使用库函数:void exit(int retval);
3:系统调用接口:void_exit(int retval)
void exit (int retval)
库函数exit作用:在程序退出前刷新缓冲区,将缓冲区中数据写入文件中;
系统调用接口exit:直接释放资源;
缓冲区:缓冲区是内存空间的一部分,当我们进行IO操作的时候不会理解IO,要先将数据放到缓 冲区中,大量的小的数据累计到缓冲区中,当缓冲区满了。就累积成了大数据,再进行 IO操作就可以达到,一次IO操作就写入了多次IO数据,减少了大量的IO操作,提高了效率
普通文件和标准输出(显示器设备文件)是不一样的:
1.普通文件是全缓冲(缓冲区满的时候刷新缓冲区)
2.显示器设备文件是行缓冲(数据在有换行就会刷新缓冲区)
指令:echo$? (获取进程返回值)
三、进程等待
作用
创建一个子进程后,等待子进程的退出,获取子进程的退出状态,避免僵尸进程的产生
接口
int wait (int *statu); -- 阻塞接口
阻塞:为了完成某个操作,发起调用。若不具备操作的完成条件,则调用一直等待
非阻塞:为了完成某个操作,发起调用。若不具备操作的完成条件,立即报错返回。
功能:等待一个子进程退出,若当前没有子进程退出,一直等待直到成功退出。
返回值:返回值大于0代表退出成功,表示的是退出子进程的pid,出错返回-1
参数:int *statu--表示整形空间的地址,报错退出子进程的退出状态。
int waitpid (pid_t pid, int *statu, int option); -- 阻塞接口
功能:若pid参数设置为-1,表示等待任意子进程退出,否则就是等待指定子进程退出
参数:
pid:-1等待任意子进程,大于0表示等待指定子进程
statu:获取退出子进程的退出状态
option:0-默认阻塞操作,WNOHANG——非阻塞操作
statu:
对于返回值用了一个字节来保存,在大多计算机在8位为一个字节,int类型是4个字节,及32位,其中前16位没有用到,后十六位中,前8位存储的是进程的退出码(进程的退出码只有一个字节)。低8位中的高1位有一个比特位的core dump标志,标记是否开启了核心转储功能。
核心转储功能:
core dump:程序异常退出时,保存程序的运行数据。
目的:能够进行程序运行崩溃后的事后调试
低7位:存储异常退出的信号值(崩溃)
由于一个程序只有正常退出,返回值才是有意义的,所以问你获取返回退出码时,
要先判断进程是否正常退出
判断方法:低7位存储的是进程异常退出的信号值,低7位为0正常退出,非0表示异常 退出
低7位获取方法:statu & 0x7F
中8位获取:(statu >> 8) & 0xFF
判断进程是否正常:
接口:WIFEXITED(statu) 正常为真,否则为假——0为假,非0为真
WEXITSTATUS(statu) 提取statu的退出码——宏定义在<sys/ait.h>头文件中
例:printf("statu: %d\n", WEXITSTATUS(statu) );
四、进程替换
概念:替换进程的描述信息,让当前进程描述另一个进程(程序的运行过程)
功能:让一个进程运行另一个程序
接口:
int execve(char* path, char* argv[], char* env[]);
功能:程序替换
参数:
path:一个新的进程的路径名
argv:要运行的新程序的运行参数
env:要运行的新程序的环境变量
返回值:替换成功返回-1,失败没有返回值