第五十八章、linux中的3种正常结束进程的方式你都了解么

在前两章中我们了解了创建进程,这一章我们来了解下,在linux下怎么结束进程。

在linux中,有3种正常结束进程的方法和2种异常终止的方法:

1、 正常结束:

a、 在main函数中调用return。这个相当于调用exit。

b、 调用exit函数,按这个函数在ANSI C中的定义,调用时将执行所有注册过的exit句柄,关闭所有的标准I/O流,但是并不处理文件描述符、多进程(父进程与子进程)、作业等,因而对linux系统而言并不完善。

c、 调用_exit函数。exit被_exit调用,关闭一些linux特有的退出句柄。

2、异常终止

a、 调用abort。这个其实是第二种情形的特例,因为它产生一个SIGABRT信号。

b、 进程收到特定信号,这个信号可以是进程自己产生的(如abort函数),也可以来自其他进程或内核。例如:进程企图访问越界的内存地址或者除数为零时,内核都会产生信号中断进程。

不管用何种方式结束进程,最终都要执行内核的同一段代码。这段代码关闭该进程打开的所有文件描述符,私访占用的内存等。

接下来我们来了解下exit和_exit函数

这两个函数在不同的头文件中:exit在stdlib.h中,_exit在unistd.h中

他们的具体调用形式如下:

void exit (int __status)

void _exit (int __status)

参数status为退出的状态。

我们来看一下下面这两段代码:

图1

图2

图3

图4

图1的代码缺少了\n导致了没有打印出测试结束的语句,这是因为printf 如果不加 \n, 则信息是不会立刻打印出来的,而 _exit 不会强制输出缓冲区中的数据,即通过printf/fprintf 这类调用产生的尚未写入设备仍在缓冲中的数据都会丢弃, _exit 时打印信息会丢失,而 exit 不会。 如果有 \n ,则直接打印出来,此时 exit/_exit 无区别

父子进程终止的先后顺序不同会产生不同的结果

1.父进程先于子进程终止:

此种情况就是我们所说的孤儿进程。当父进程先退出时,系统会让init进程接管子进程 。

2.子进程先于父进程终止,而父进程又没有调用wait函数

此种情况子进程进入僵死状态,并且会一直保持下去直到系统重启。子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需。此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数。

什么是 僵死状态呢?

一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为僵死进程(zombie)。

3.子进程先于父进程终止,而父进程调用了wait函数

此时父进程会等待子进程结束。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();