维护网站要做哪些工作,金华市住房建设局网站,海南网站开发公司,中国郑州建设信息网站Linux的源码
#define __NR_exit 1
#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h*/ __NR_是在Linux的源码中为每个系统调用加上的前缀#xff0c;请注意第一个exit前有2条下划线#xff0c;第二个exit前只有1条下划线…
Linux的源码
#define __NR_exit 1
#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h*/ __NR_是在Linux的源码中为每个系统调用加上的前缀请注意第一个exit前有2条下划线第二个exit前只有1条下划线。
Linux核心还提供了一些C语言函数库这些库对系统调用进行了一些包装和扩展因为这些库函数与系统调用的关系非常紧密所以习惯上把这些函数也称为系统调用。#define这句只能说明内核里的两个系统调用_exit和exit相同但其封装后对应的C库函数_exit()和exit()是不同的。
exit()函数定义在stdlib.h中而_exit()定义在unistd.h中;
exit()函数的作用最为简单直接使进程停止运行清除其使用的内存空间并销毁其在内核中的各种数据结构exit()函数则在这些基础上作了一些包装在执行退出之前加了若干道工序也是因为这个原因有些人认为exit已经不能算是纯粹的系统调用。
exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况把文件缓冲区中的内容写回文件即所谓的清理I/O缓冲。
‘exit()’与‘_exit()’有不少区别在使用‘fork()’特别是‘vfork()’时变得很 突出。 ‘exit()’与‘_exit()’的基本区别在于前一个调用与实施库里用户状态结构 (user-mode constructs)有关的清除工作(clean-up)而且调用用户自定义的清除程序 (译者注自定义清除程序由atexit函数定义可定义多次并以倒序执行)相对 应后一个函数只为进程实施内核清除工作。 在由‘fork()’创建的子进程分支里正常情况下使用‘exit()’是不正确的这是 因为使用它会导致标准输入输出(译者注stdio: Standard Input Output)的缓冲区被 清空两次而且临时文件被出乎意料的删除(译者注临时文件由tmpfile函数创建 在系统临时目录下文件名由系统随机生成)。在C程序中情况会更糟因为静 态目标(static objects)的析构函数(destructors)可以被错误地执行。(还有一些特殊情况比如守护程序它们的父进程需要调用‘_exit()’而不是子进程适用于绝大多数情况的基本规则是‘exit()’在每一次进入‘main’函数后只调用一次。) 在由‘vfork()’创建的子进程分支里‘exit()’的使用将更加危险因为它将影响 父进程的状态