进程的启动和终止

2014-07-30 18:07:48   最后更新: 2014-09-18 09:04:12   访问数量:1114




int main (int argc, char *argv[])

 

atgc是命令行参数的个数,argv是指向参数的各个指针所构成的数组

 

内核使用一个 exec 函数执行程序,在调用main前,先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址 -- 这是由链接编辑器设置的,而链接编辑器则由C编译器(gcc)调用。启动例程从内核取得命令行参数和环境变量值,然后调用main函数

 

有8种方式使进程终止,其中5种为正常终止,3种为异常终止

1、正常终止

  1. 从 main 返回
  2. 调用 exit 函数
  3. 调用 _exit 或 _Exit
  4. 最后一个线程从其启动例程返回
  5. 最后一个线程调用pthread_exit

2、异常终止

  1. 调用abort
  2. 接到一个信号并终止
  3. 最后一个线程对取消请求作出响应

 

void exit (int status);

 

定义于 stdlib.h 头文件中

总是会先执行标准IO库的清理关闭操作和fclose函数以使所有缓冲的数据都被冲洗(写到文件上),是一个库函数,通过调用终止处理程序和信号处理程序后调用_exit实现。

 

void _Exit (int status);

 

定义于 stdlib.h 头文件中

由ISO C定义,不运行终止处理程序和信号处理程序,是否冲洗标准IO流取决于实现,在UNIX系统中的实现是冲洗IO流的

 

void _exit(int status);

 

定义于unistd.h头文件中

POSIX.1版本的_Exit,于_Exit完全相同,是一个系统调用

 

1、abort

void abort();

 

定义于 stdlib.h 中

 

调用abort后,产生SIGABRT信号,是异常终止的一种特例。

其实现方式是 raise(SIGABRT) 函数

 

2、信号

当进程接收到某些信号时,信号可由进程自身(调用abort函数)、其他进程或内核产生

 

3、取消

最后一个线程对“取消”请求做出响应则进程异常中止,按系统默认。“取消”以延迟的方式发生,一个线程要求取消另一个线程,一段时间后,目标线程终止。

 

  • 无论进程怎么终止,最后都会执行内核中的同一段代码,关闭所有打开的文件描述付,释放存储器等
  • 可以使用echo $? 命令打印程序的终止状态,进程的最后一个线程调用pthread_exit函数结束后,进程终止状态总是0,于pthread_exit的参数无关。

 

进程的启动和终止图示:

 

e.g.

/* * file: fig7.3 * author: 龙泉居士 * date: 2012-09-11 10:54 */ #include "apue.h" static voidmy_exit1(void); static voidmy_exit2(void); int main(void) { if (atexit(my_exit2) != 0) err_sys("can't register my_exit2"); if (atexit(my_exit1) != 0) err_sys("can't register my_exit1"); if (atexit(my_exit1) != 0) err_sys("can't register my_exit1"); printf("main is done\n"); return(0); } static void my_exit1(void) { printf("first exit handler\n"); } static void my_exit2(void) { printf("second exit handler\n"); }

 

 

运行结果是:

main is done

first exit handler

first exit handler

second exit handler

可见,由atexit登记过的函数会在程序终止前顺次执行

 






读书笔记      linux      unix      龙潭书斋      apue      unix环境高级编程      进程      终止      exit      _exit     


京ICP备15018585号