进程的终止

来源:互联网 发布:断点续传java 编辑:程序博客网 时间:2024/06/05 07:08

有五种方法使进程终止:

1.正常终止

     (1)在main函数内执行return语句,这等效于调用exit。

     (2)调用exit函数。此函数由ANSI C定义,其操作包括调用各终止处理程序,然后关闭所有标准I/O流等。

     (3)调用_exit系统调用函数,此函数由exit调用。


2.异常终止

    (1)调用abort。

    (2)由一个信号终止。

下面介绍exit和_exit函数。

例子:设计一个程序,要求子进程和父进程都在显示输出一些文字后分别调用exit和_exit函数终止进程。

  1 #include<stdio.h>  2 #include<stdlib.h>  3 #include<unistd.h>  4 #include<sys/types.h>  5 int main()  6 {  7     pid_t pid;  8     pid = fork();  9     if(pid==-1) 10     { 11       perror("创建子进程失败"); 12       exit(0); 13     } 14     else if(pid ==0 ) 15     { 16         printf("测试终止进程的_exit函数!\n"); 17         printf("目前为子进程,这一行我们用缓存!"); 18         _exit(0); 19     } 20     else 21     { 22         printf("测试终止进程的exit函数!\n"); 23         printf("目前为父进程,这一行我们用缓存!"); 24         exit(0); 25     } 26  27     return 0; 28 }

显示结果:

测试终止进程的_exit函数!测试终止进程的exit函数!目前为父进程,这一行我们用缓存!


  由于printf()函数使用的是缓冲I/O方式,在遇到“\n”换行符时,自动从缓冲区将记录读出。上例子中可以看出,调用exit函数时,缓冲区中的记录能正常输出;而调用_exit时,缓冲区中的记录无法输出。

_exit()函数的作用是直接使进程终止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在执行退出之前加了若干道工序,exit函数在调用exit系统之前要查看文件的打开情况,把文件缓冲区中的内容写回文件。exit和_exit函数的区别如下图:


在liunx的标出函数库中,有一种被称作“缓冲I/O”操作,就是对应每一个打开的文件,在内存中都有一片缓冲区,每次读写文件时,都在缓冲区里读取,写入的。每次写入文件时,等满足了一定条件才将缓冲区中的内容一次性写入文件,这种技术大大增加了文件读写的速度。但是,有时没有满足选定条件,数据还只是保存在缓冲区,这时用_exit函数直接结束进程关闭,缓冲去中的数据就会丢失。因此,若想保证数据的完成性,就一定要使用exit函数终止进程。

注:因为"\n"的作用可以修改一下这两句代码看看:

printf("目前为子进程,这一样我们用缓存!\n");

printf("目前为父进程,这一样我们用缓存!\n");