在linux系统中,启动一个可执行程序program,便在内核中生成一个进程process,且被内核赋予一个唯一的非负整数的进程号PID(process ID)。内核通过一个task_struct结构体(进程表项/进程控制块)维护和记录该进程的所有信息,例如进程状态state,优先级priority,终端信息tty_struct,目录信息fs_struct,文件信息files_struct,内存映射mm_struct,信号信息signal_struct等。
言归正传。当一个程序执行前,即运行main函数前,内核会先行启动一个特殊的例程☞启动例程。对了,它的作用有三:
1/将命令行上的函数参数传给argc,argv;
2/创建环境表传递给函数;
3/登记进程的终止函数
之后内核便正常启动我们的进程!
那么进程又是如何结束的呢?
一般进程的结束分为三种☞
1/正常结束;即通过return exit _exit(_Exit) pthread_exit返回,或者是通过最后一个线程的启动例程返回;
2/异常结束;通过调用abort,或发送终止信号,取消请求的响应;
3/进程返回。正常返回0,不正常返回非0。
一个例子☞
Q:如何定义自己的终止函数?
A:int atexit(void (*term_function)(void))
通过atexit()函数可以像内核自定义注册终止函数,也可以在同一个程序中注册多个自定义终止函数,它们按照先注册后运行的栈方式在程序调用exit或return后运行。需要特别注意的是如果程序中调用的是系统退出函数_exit,则我们自定义的终止函数将不会被执行,且也不会refresh程序的缓冲区(可以在程序结束前调用fflush强制refresh)。
无图无真相!