进程创建:fork()
* 子进程的复制:写时拷贝技术(代码共享,数据独有)
* 返回值不同,父进程返回子进程pid,子进程返回0
进程终止:进程退出要保存退出原因(让父进程能够获取到子进程的退出原因,进而了解子进程运行的任务是否正确完成)
* 进程退出场景:正常退出,结果正确;正常退出,结果错误;异常退出(返回值不能作为判断标准)
* 进程的退出:
* main中return效果等同于调用exit
* void exit(int status);库函数//退出一个进程,退出时刷新缓冲区–很多其他释放操作
* void _exit(int status);系统调用//粗暴退出,直接释放缓冲区
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
for(int i=0;i<255;i++)
{
printf("%s\n",atrerror(i));
}
//进程的退出数据只能是一个小于256的数据
//因为进程的退出码只使用一个字节来存储
return 0;
while(1)
{
printf("----\n");
sleep(1);
}
return 0;
}
进程等待:
* 等待子进程退出,避免产生僵尸进程, wait waitpid
* 子进程的退出返回值status:两个字节中的存储(退出码,coredump标志,异常信号)
阻塞:为了完成一个功能,发起调用,如果当前不具备完成条件,则挂起等待
非阻塞:为了完成一个功能,发起调用,如果当前不具备完成条件,直接报错返回
阻塞与非阻塞的区别:发起调用后是否会立即返回;
获取返回值:子进程返回的数据是一个字节
因为子进程 的返回值只有一个字节,而剩下字节存储是其他数据,因此直接打印这个statu将无法获取到返回值,低七位存储进程退出的信号值,并且这低七位用于判断一个进程是否是正常退出
程序替换:
* 一个 进程运行什么代码,取决于虚拟地址空间中的代码段映射物理地址中的哪一个真实代码区域意味着如果将虚拟地址代码段映射到物理内存的代码位置替换成另一个程序的位置,那个进程将运行另一个程序
* 是什么:替换代码段映射的代码位置成为另一个内存区域代码的位置,并且重新初始化数据段
* 为什么:大多数情况,我们创建一个子进程是为了让子进程运行另一个程序,做其他任务
* 实现:一套接口实现函数替换,统称exec函数族