【Linux】介绍:进程退出、进程等待、进程程序替换

目录

一、进程退出

_exit函数

exit函数 

 _exit()与exit比较

return退出

二、进程等待

wait方法

waitpid方法

 三、进程程序替换

替换函数

函数解释

命名理解

使用举例


一、进程退出

正常终止(可以通过 echo $? 查看进程退出码):
1. 从main返回
2. 调用exit
3. _exit

_exit函数

#include
void _exit(int status);

参数:status 定义了进程的终止状态,父进程通过wait来获取该值

说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255

函数解释:

通常通过将控制返回给主机环境来终止进程,但不执行任何用于终止进程的常规清理任务(如函数退出所做的)。
不调用对象析构函数,也不调用atexit或at_quick_exit注册的函数。
C流是否关闭和/或刷新,以及使用tmpfile打开的文件是否被删除取决于特定的系统或库实现。(即不刷新缓冲区,不会关闭流,打开的文件不会关闭,删除)
如果status为0或EXIT_SUCCESS,则返回主机环境的成功终止状态。
如果status为EXIT_FAILURE,则返回不成功的终止状态

exit函数 

#include
void exit(int status);

函数解释:

1. 执行用户通过 atexit或on_exit定义的清理函数。
2. 关闭所有打开的流,所有的缓存数据均被写入
3. 调用_exit

 _exit()与exit比较

【Linux】介绍:进程退出、进程等待、进程程序替换_第1张图片 总结:_exit()不会做"善后工作",而exit()会。

return退出

return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。

二、进程等待

wait方法

#include
#include
pid_t wait(int*status);
返回值:

成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options);
返回值:

当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:

Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

 三、进程程序替换

替换函数

其实有六种以exec开头的函数,统称exec函数

#include
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

  • 所以exec函数只有出错的返回值而没有成功的返回值。

命名理解

这些函数原型看起来很容易混,但只要掌握了规律就很好记
 

  • l(list) : 表示参数采用列表

  • v(vector) : 参数用数组

  • p(path) : 有p自动搜索环境变量PATH

  • e(env) : 表示自己维护环境变量

【Linux】介绍:进程退出、进程等待、进程程序替换_第2张图片

 使用举例

#include 

int main()
{
    char *const argv[] = {"ps", "-ef", NULL};
    char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};

    execl("/bin/ps", "ps", "-ef", NULL);
    // 带p的,可以使用环境变量PATH,无需写全路径
    execlp("ps", "ps", "-ef", NULL);
    // 带e的,需要自己组装环境变量
    execle("ps", "ps", "-ef", NULL, envp);
    execv("/bin/ps", argv);
    // 带p的,可以使用环境变量PATH,无需写全路径
    execvp("ps", argv);
    // 带e的,需要自己组装环境变量
    execve("/bin/ps", argv, envp);
    exit(0);
}

你可能感兴趣的:(linux)