一、进程与信号之退出与终止
C程序启动过程
内核启动特殊例程
启动例程
在进程的main函数执行前会启动
该例程放在在/lib/libc.so**中
编译器在编译时会启动例程编译进可执行文件中
启动例程作用
搜索命令行参数传递给main函数中的argc、argv
搜索环境信息构建环境表并传递给main函数
等级进程终止函数
进程终止
正常终止
main函数返回
调用exit(标准库函数)
调用_exit或者_Exit(系统调用)
最后一个线程从启动例程返回
最后一个线程pthread_exit
异常终止
调用abort
接受一个信号并终止返回
最后一个线程对取消请求做处理相应
进程返回
成功返回0,否则非0
shell中查看进程返回(echo $?)
自定义终止函数
#include <stdlib.h>
int atexit(void(*function)(void))
成功返回0,否则非0
#include <unistd.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> void exit_fun1(void) { printf("first exit_fun1\n"); } void exit_fun2(void) { printf("second exit_fun2\n"); } void exit_fun3(void) { printf("thread exit_fun3\n"); } int main(int argc,char* argv[]) { if(argc<=2) { printf("usage: %s file[exit|_exit|return]\n",argv[0]); return 1; } //像内核注册函数 atexit(exit_fun1); atexit(exit_fun2); atexit(exit_fun3); FILE *fp=fopen(argv[1],"w"); fprintf(fp,"hello word\n"); //结束进程 if(!strcmp(argv[2],"exit")) { exit(0); } else if(!strcmp(argv[2],"return")) { return 0; } else if(!strcmp(argv[2],"_exit")) { _exit(0); } else { fprintf(stderr,"usage:%s file[exit|return|_exit]",argv[1]); return 1; } }
执行结果
./signal_exit a.txt return thread exit_fun3 second exit_fun2 first exit_fun1 ./signal_exit a.txt exit thread exit_fun3 second exit_fun2 first exit_fun1 ./signal_exit a.txt _exit