有五种方法使进程终止:
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函数!
目前为父进程,这一行我们用缓存!
_exit()函数的作用是直接使进程终止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在执行退出之前加了若干道工序,exit函数在调用exit系统之前要查看文件的打开情况,把文件缓冲区中的内容写回文件。exit和_exit函数的区别如下图:
在liunx的标出函数库中,有一种被称作“缓冲I/O”操作,就是对应每一个打开的文件,在内存中都有一片缓冲区,每次读写文件时,都在缓冲区里读取,写入的。每次写入文件时,等满足了一定条件才将缓冲区中的内容一次性写入文件,这种技术大大增加了文件读写的速度。但是,有时没有满足选定条件,数据还只是保存在缓冲区,这时用_exit函数直接结束进程关闭,缓冲去中的数据就会丢失。因此,若想保证数据的完成性,就一定要使用exit函数终止进程。
注:因为"\n"的作用可以修改一下这两句代码看看:
printf("目前为子进程,这一样我们用缓存!\n");
printf("目前为父进程,这一样我们用缓存!\n");