玳瑁的嵌入式日记D26-0826(进程)
回调函数 atexit
int atexit(void (*function)(void));
功能:
注册进程退出前执行的函数
参数:
function: 函数指针
指向void返回值void参数的函数指针
返回值:
成功返回0
失败返回非0
当程序调用 exit 或者由main函数执行return时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用
-
触发时机
只有当程序正常终止时,atexit注册的函数才会被调用,包括:main函数执行结束并返回;- 调用
exit函数终止程序; - 程序执行到最后一条语句后自然退出。
以下情况不会触发:
- 调用
_exit或_Exit函数(直接终止程序,不执行清理); - 程序因信号(如
Ctrl+C触发的SIGINT)或异常崩溃而终止。
进程空间的回收
wait/waitpid
pid_t wait(int *status);
功能:该函数可以阻塞等待任意子进程退出, 并回收该进程的状态。
一般用于父进程回收子进程状态。
参数:status 进程退出时候的状态
如果不关心其退出状态一般用NULL表示
如果要回收进程退出状态,则用WEXITSTATUS回收。
返回值:成功 回收的子进程pid
失败 -1;
正常结束
WIFEXITED(status) 是不是正常结束
WEXITSTATUS(status) 使用这个宏去那返回值
异常终止
WIFSIGNALED(status) 是不是收到了信号而终止的
WTERMSIG(status)如果是信号终止的,那么是几号信号。

两两使用




非阻塞回收
waitpid
pid_t wait(int *status);
1)如果所有的子进程都在运行,在阻塞
2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。
3)如果没有子进程,则立即出错退出。
参数说明
-
pid:指定要等待的子进程 ID
pid > 0:等待进程 ID 为pid的子进程pid = 0:等待与当前进程同组的任意子进程pid = -1:等待任意子进程(与wait()功能相同)pid < -1:等待进程组 ID 为pid绝对值的任意子进程
-
status:用于存储子进程的退出状态信息的指针
- 如果为
NULL,表示不关心子进程的退出状态 - 可以使用
WIFEXITED()、WEXITSTATUS()等宏来解析状态
- 如果为
-
options:控制等待行为的选项
WNOHANG:非阻塞模式,如果没有子进程退出,立即返回 0WUNTRACED:同时返回被暂停的子进程状态WCONTINUED:返回被继续运行的子进程状态
返回值
- 成功:返回状态改变的子进程 ID
- 失败:返回 - 1,并设置
errno - 使用
WNOHANG且没有子进程退出时:返回 0




exec
// 1. 路径名 + 可变参数列表(以NULL结尾)
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
// 2. 文件名(依赖PATH环境变量) + 可变参数列表
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
// 3. 路径名 + 字符串数组(argv风格)
int execv(const char *path, char *const argv[]);
// 4. 文件名(依赖PATH) + 字符串数组
int execvp(const char *file, char *const argv[]);


openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)