进程的终止

有五种方法使进程终止:

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");










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值