在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)。

无图无真相!

term123为自定义终止函数
1.栈方式调用term函数;2.程序调用_exit退出时,不执行term函数。