进程等待:wait、waitpid
一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,且内核中还保存着一些信息。如果是正常终止,则保存着退出状态;如果是异常终止,则保存着导致该进程终止信号。这个进程的父进程可以调用wait和waitpid获取这些信息,然后彻底清除这个进程。
等待目的-- 1)为了让父进程读取到子进程退出状态信息(输出型参数status)。
2)让系统释放子进程占有的僵尸状态的资源。
3)保证子进程先退出,父进程最后退出。(父子进程退出同步、有顺序)
等待方式--阻塞、非阻塞、异步
1.wait
子进程运行结束,父进程等到子进程的退出码,父进程退出。
2.waitpid
进程退出的三种情况:
(1)进程运行完,结果正确 (2)进程运行完,结果错误 (3)进程代码没有运行完,结果未知。
当一个进程正常或异常终止时,内核就向其父进程发送一个SIGCHLD信号。
进程是否正常运行:exit( )---0-正常 非零-异常<即退出码(0-255)>
低八位-status&0xff <信号编号 (子进程是否跑完) 0-没发送信号> 次低八位-(status>>8)&0xff<退出码>;
3.非阻塞等待
子进程一直循环,不退出,父进程也不能退出。
进程的程序替换 execv:
子进程不执行父进程的任何代码,执行其他程序(ls)(用 ls code,ls data)
1)exec的6种函数:
#incldue<unistd.h>
int execl(const char* path,const char* arg,....);
int execlp(const char* file,const char* arg,....);
int execle(const char* path,const char* arg,..., char* const emp[]);
int execv(const char* path,char* const argv[]);
int execp(const char* file,char* const argv[]);
int execve(const char* path,char* const argv[],char* const emp[]);
int execl(const char* path,const char* arg,....);
int execlp(const char* file,const char* arg,....);
int execle(const char* path,const char* arg,..., char* const emp[]);
int execv(const char* path,char* const argv[]);
int execp(const char* file,char* const argv[]);
int execve(const char* path,char* const argv[],char* const emp[]);
2)函数的一些规则:
函数名exec:带上p--二进制文件不带路径,否则要path; 包含e--允许传递函数变量表envp[ ];
l--参数是可变参数列表;v--参数是argv[ ]向量表统一传参;
3)函数的应用:
在子进程中添加execl函数