Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17831
  • 博文数量: 7
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 75
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-27 05:42
文章分类

全部博文(7)

文章存档

2012年(7)

我的朋友
最近访客

分类: LINUX

2012-04-11 22:18:14

#include
void exit(int status);
不像fork那么难理解,从exit的名字就能看出,这个系统调用是用来终止一个进程的。无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。请看下面的程序:
/* exit_test1.c */
#include
main()
{
printf("this process will exit!\n");
exit(0);
printf("never be displayed!\n");
}
编译后运行:
$gcc exit_test1.c -o exit_test1
$./exit_test1
this process will exit!
我们可以看到,程序并没有打印后面的"never be displayed!\n",因为在此之前,在执行到exit(0)时,进程就已经终止了。
exit 系统调用带有一个整数类型的参数status,我们可以利用这个参数传递进程结束时的状态,比如说,该进程是正常结束的,还是出现某种意外而结束的,一般来说,0表示没有意外的正常结束;其他的数值表示出现了错误,进程非正常结束。我们在实际编程时,可以用wait系统调用接收子进程的返回值,从而针对不同的情况进行不同的处理。关于wait的详细情况,我们将在以后的篇幅中进行介绍。
exit和_exit
作为系统调用而言,_exit和exit是一对孪生兄弟。
这时随便一个懂得C语言并且头脑清醒的人都会说,_exit和exit没有任何区别,但我们还要讲一下这两者之间的区别,这种区别主要体现在它们在函数库中
的定义。_exit在Linux函数库中的原型是:
#include
void _exit(int status);
exit比较一下,exit()函数定义在 stdlib.h中,而_exit()定义在unistd.h中,从名字上看,stdlib.h似乎比unistd.h高级一点,那么,它们之间到底有什么区别呢?

_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为exit已经不能算是纯粹的系统调用。
exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是“清理I/O缓冲”。
在Linux 的标准函数库中,有一套称作“高级I/O”的函数,我们熟知的printf()、fopen()、fread()、fwrite()都在此列,它们也被称作“缓冲I/O(buffered I/O)”,其特征是对应每一个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就大大增加了文件读写的速度,但也为我们编程带来了一点点麻烦。如果有一些数据,我们认为已经写入了文件,实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,如果想保证数
据的完整性,就一定要使用exit()函数。
请看以下例程
/* exit2.c */
#include
main()
{
printf("output begin\n");
printf("content in buffer");
exit(0);
}
编译并运行:
$gcc exit2.c -o exit2
$./exit2
output begin
content in buffer

/* _exit1.c */
#include
main()
{
printf("output begin\n");
printf("content in buffer");
_exit(0);
}
编译并运行:
$gcc _exit1.c -o _exit1
$./_exit1
output begin

阅读(733) | 评论(4) | 转发(2) |
0

上一篇:linux 中文显示乱码解决办法

下一篇:getchar

给主人留下些什么吧!~~

lp40833312012-04-21 22:31:07

重返人生: 很好的文章,楼主现在是从事什么工作的?.....
主要是C编程的一些工作,做服务

重返人生2012-04-15 20:36:07

很好的文章,楼主现在是从事什么工作的?

☆彼岸★花开2012-04-14 12:01:37

不错~~借鉴了一下,楼主辛苦了!!

十七岁的回忆2012-04-12 10:15:23

如果想保证数据的完整性要使用exit()函数,哦哦,以后会注意,谢谢了