一、进程的退出状态
exit()
:- 功能:让进程退出并刷新缓冲区。
- 参数:
status
表示进程退出的状态。 - 返回值:缺省。
EXIT_SUCCESS
表示正常退出,EXIT_FAILURE
表示异常退出。exit
会调用atexit
注册的退出函数,而_exit
不会。
_exit
:- 功能:让进程退出,不刷新缓冲区。
- 参数:
status
表示进程退出状态。 - 返回值:缺省。
二、进程空间的回收
wait
:- 功能:阻塞等待任意子进程退出,并回收该进程的状态,一般用于父进程回收子进程状态。
- 参数:
status
表示子进程退出时的状态,如果不关心退出状态可用NULL
,如果要回收进程退出状态,则用WEXITSTATUS
回收。 - 返回值:成功回收的子进程PID,失败返回-1。
三、僵尸进程和孤儿进程
- 孤儿进程:子进程还在,但父进程已经结束,此时由
init
进程收养子进程,避免子进程无人收尸。 - 僵尸进程:父进程还在,子进程先结束,但父进程没有做收尸操作,子进程进入僵尸态。
四、exec 函数族
在 Linux 中,exec 函数族用于在一个进程中执行另一个程序。当进程调用 exec 函数时,该进程的用户空间代码和数据将被新程序替换,从新程序的启动例程开始执行。调用 exec 并不创建新进程,所以调用 exec 前后该进程的 ID 并未改变。
exec 函数族包括以下几种函数:
execl
:int execl(const char *path, const char *arg,...)
,以逐个列举参数的方式执行文件。execv
:int execv(const char *path, char *const argv[])
,以指针数组的方式传递参数执行文件。execlp
:int execlp(const char *file, const char *arg,...)
,根据系统环境变量 PATH 搜索可执行文件并执行。execvp
:int execvp(const char *file, char *const argv[])
,与 execlp 类似,但以指针数组的方式传递参数。execle
:int execle(const char *path, const char *arg,..., char * const envp[])
,可以传递环境变量。execvpe
:int execvpe(const char *file, char *const argv[], char *const envp[])
,与 execle 类似,但根据文件搜索方式不同。
这些函数的区别如下:
- 参数传递方式:
- 带
l
的函数(如execl
)以逐个列举参数的方式传递参数,最后以NULL
结尾。 - 带
v
的函数(如execv
)以指针数组的方式组织参数。
- 带
- 文件搜索方式:
- 带
p
的函数(如execlp
和execvp
)只在系统环境变量PATH
中搜索可执行文件。 - 其他函数(如
execl
、execv
、execle
和execvpe
)需要提供完整的文件路径。
- 带
- 环境变量传递:带
e
的函数(如execle
和execvpe
)可以传递环境变量,其他函数使用父进程继承的环境变量。
需要注意的是,exec 函数只有在调用出错时才会返回 -1,成功执行新程序后不会返回。此外,在使用 exec 函数时,需要确保提供的文件路径或文件名正确,以及参数和环境变量的设置符合要求。