回调函数  atexit

int atexit(void (*function)(void));
功能:
注册进程退出前执行的函数
参数:
function: 函数指针
指向void返回值void参数的函数指针
返回值:
成功返回0
失败返回非0

当程序调用 exit 或者由main函数执行return时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用

  1. 触发时机
    只有当程序正常终止时,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)如果没有子进程,则立即出错退出。

参数说明

  1. pid:指定要等待的子进程 ID

    • pid > 0:等待进程 ID 为pid的子进程
    • pid = 0:等待与当前进程同组的任意子进程
    • pid = -1:等待任意子进程(与wait()功能相同)
    • pid < -1:等待进程组 ID 为pid绝对值的任意子进程
  2. status:用于存储子进程的退出状态信息的指针

    • 如果为NULL,表示不关心子进程的退出状态
    • 可以使用WIFEXITED()WEXITSTATUS()等宏来解析状态
  3. options:控制等待行为的选项

    • WNOHANG:非阻塞模式,如果没有子进程退出,立即返回 0
    • WUNTRACED:同时返回被暂停的子进程状态
    • 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[]);

Logo

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

更多推荐