进程的退出、等待以及程序替换

进程退出

正常退出(三个)

主函数中return

void _exit(int return _val);//系统调用接口

#include<stdlib>

void exit(inr return _val);//库函数

异常退出(两个)

#include<stdio.h>

void perror(char* mag);//打印上一次系统调用的错误原因

char* strerror(int errno);//获取上一次系统调用的错误原因

1)当一个进程未调用exit、_exit()、exit()而异常退出时,会对该进程中的数据造成破坏;
2)当调用vfork创建子进程后,如果子进程未调用exit或者_exit等正常退出,那么父进程可能不会被执行。

进程等待

父进程在创建子进程之后等待子进程退出,获取子进程退出返回值,释放子进程资源,避免僵尸进程的产生。

pid_t wait(int* status);

//阻塞等待任意子进程退出,使用status作为输出参数获取子进程退出返回值,成功返回子进程id,失败返回-1;

pid_t waidpid(pid_t pid ,int * status, int options);

//处理任意或特定子进程退出,pid为-1是为任意子进程,option为0时阻塞等待,为WNOHANG时非阻塞,非阻塞情况下需循环调用,否则依然会出现僵尸进程。

程序替换

将新的程序加载到内存中,然后改变一个进程的页表映射信息,将其更改到新的程序的指令和数据上,这时pcb管理的就不是原本的程序运行了,而是一个新的程序,常用于子进程替换让其运行指定的程序。

进行程序替换的方式—exec函数簇

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 envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

//使用时存在差异
/*
(1)函数名中有l和有v的区别:
l是通过不定参来赋予新程序的运行参数;
v是通过字符串指针数组来进行赋值的;

(2)函数名中是否有p的区别:
在于第一个参数的不同,如果没p,那么需要提供一个带路径的文件名;
如果有p那么只需要提供文件名称即可,会默认会去PATH环境变量的路径中去寻找;

(3)函数名中有没有e的区别:
表示这个进程的环境变量需不需进行初始化,如果有e则表示需要初始化;
没有e则表示使用默认的环境变量;
*/

猜你喜欢

转载自blog.csdn.net/SFDWU3QVG/article/details/126438286