Linux exit函数学习


exit是一个库函数,在进程正常结束时调用,
#include <stdlib.h>

void exit(int status);

_exit是一个系统调用,用来终止一个进程,
#include <unistd.h>

void _exit(int status);

exit与_exit都是用来正常退出进程,二者区别在于:
exit库函数会先检查进程打开文件的状况,并且负责把文件缓冲区中的内容写回到文件中;
而_exit系统调用则不会。
所以调用_exit系统调用退出进程有可能会造成文件内容丢失。

这是因为linux标准函数库,为了提高写文件的效率,提供了一种缓冲I/O机制。
每打开一个文件,都会从内存中开辟一个缓冲区,
这样写文件时它会先写到缓冲区中(并不是真正的写磁盘),
这样可以节省大量的I/O操作带来的频繁的从用户态往内核态切换的开销。
缓冲I/O机制的目的是为了提高写效率。

所以为了保证数据不会丢失,在进程退出时调用exit()函数会比较保险。
可以写一个简单的测试小程序来测试exit与_exit的差别。
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("test exit\n");
    exit(0);
}

由于标准I/O函数printf是行缓冲函数,所以有没有'\n'是会对实际结果产生影响的。
因为是行缓冲,所以遇到换行符时就会执行I/O操作。

linux系统进程终止的方式有正常退出和异常退出,
其中:
程序中调用exit或_exit或return掉都是属于正常退出方式;
如果是程序调用了abort函数或收到了某个能使进程终止的signal比如SIGSEGV等都属于异常退出。

推荐阅读:

Linux Shell编程速查笔记

Linux下Shell编程常用grep\awk\sed语法

Linux下Shell编程——awk编程

Linux下Shell编程——sed命令基本用法

Linux下Shell编程——grep命令的基本运用

Linux下Shell编程——正则表达式基础与扩展

相关内容

    暂无相关文章