关于_exit( )系统调用

8 views
Skip to first unread message

陈继峰

unread,
Dec 13, 2007, 4:49:04 AM12/13/07
to Linuxer初学
看下面一段程序(关于_exit( )系统调用的):
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
main()
{
printf("output begin aaaa\n");
printf("output ");
printf("content in buffer"); /* 第8行 */

_exit(0);
}
编译然后运行结果是:
output begin aaaa
如果将第8行改为:printf("content in buffer\n"); /* 第8行 */
其他不变。
运行结果是:
output begin aaaa
output content in buffer
在资料上看_exit( )只是退出 不输出缓存区的内容,那么加'\n'有什么影响?

陈老师

unread,
Dec 13, 2007, 9:33:04 PM12/13/07
to Linuxer初学
这个问题提得很好,希望大家思考...

牛涛

unread,
Dec 14, 2007, 8:21:36 AM12/14/07
to Linuxer初学
在Linux的标准函数库中,像我们熟知的函数如printf()、fopen()、fread()、fwrite()都被称作"高级I/O"的函数,
也叫"缓冲I/O(buffered I/O)",其特点是对应每一个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下
次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换
行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就大大增加了文件读写的速度。如果有一些数据,我们认为已经写入了文件,实际上
因为没有满足特定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,就像你把"\n"去掉,系
统认为没满足写的条件就退出了,所以就会出现上面的情况。

李则良

unread,
Dec 15, 2007, 5:50:28 AM12/15/07
to Linuxer初学
在2.4.4版内核中,exit是第1号调用,其在Linux函数库中的原型是:
#include<stdlib.h>
void exit(int status);
而_exit在Linux函数库中的原型是:
#include<unistd.h>
void _exit(int status);
并且有 #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行
*/
两者极为相似,但exit()函数定义在stdlib.h中,而_exit()定义在unistd.h中,两者的执行流程也不一样_exit()函数的
作用:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了
若干道工序,在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
而_exit( )只是退出 不输出缓存区的内容,那么加'\n'则表明已经满足特定的条件"(达到一定数量,或遇到特定字符,如换行符\n和文件结
束符EOF),再将缓冲区中的内容一次性写入文件,"/*牛涛*/

牛涛

unread,
Dec 19, 2007, 3:13:24 AM12/19/07
to Linuxer初学
如果你既想换行,有想用_exit(),有不想用"\n",那你可在_exit()前加上fflush(stdout);这样不加换行也能打印出来。
Reply all
Reply to author
Forward
0 new messages