process environment
在解释前三个之前先说说这个:
#include <stdlib.h>
int atexit(void (*function)(void));
atexit: 注册终止函数,即结束的时候由exit调用所注册的那些函数。ISO C规定,至少可以注册32个函数。
exit调用这些注册函数的顺序与它们登记时候的顺序相反。
与析构函数的调用关系:
在atexit(f)调用之前被静态分配的对象的析构函数将在f()的调用之后被调用。
在一个atexit(f)调用之后建立的这种对象的析构函数将在f()的调用之前被调用。
引自《The C++ Programming Language》(Bjarne Stroustrup)
程序用例:
#include <stdio.h>
#include <stdlib.h>
class Dx
{
public:
Dx()
{
printf("Dx constructor 1\n");
atexit(test1);
printf("Dx constructor 2\n");
}
~Dx()
{
printf("Dx destructor 1\n");
atexit(test2);
printf("Dx destructor 2\n");
}
static void test1()
{
printf("Dx constructor register\n");
}
static void test2()
{
printf("Dx destructor register\n");
}
};
void exit1()
{
printf("exit1 register\n");
}
void exit2()
{
printf("exit2 register\n");
}
int main(int argc, char* argv[])
{
atexit(exit1);
Dx d;
atexit(exit2);
return 0;
}
输出:
Dx constructor 1
Dx constructor 2
Dx destructor 1
Dx destructor 2
Dx destructor register
exit2 register
Dx constructor register
exit1 register
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
void exit(int status);
_exit: 直接调用sys_exit终止一个进程,在sys_exit中,该进程所有打开的文件描述符关闭,子进程将被init进程继承,父进程收到一个SIGCHLD信号。POSIX.1。
_Exit: 等同于_exit,在C99的时候被引进。
exit: 执行atexit(on_exit)注册的函数,然后退出进程(刷新标准I/O流),然后调用sys_exit。A
程序用例:
#include <stdio.h>
#include <stdlib.h>
void func()
{
printf("atexit ");
}
int main(int argc, char* argv[])
{
atexit(func);
printf("stdio ");
printf("exit ");
exit(0);
}
输出:
stdio exit atexit
将exit(0)替换成_exit(0).
输出:
运行之后,什么都没有输出,说明_exit不执行刷新stdio,不执行atexit注册的函数。
这篇文章讲述了使用gdb查看_exit和exit分别干了什么事情。
http://blog.csdn.net/alex_my/article/details/39315105
2 memory layout of a C program
这部分有兴趣的可以参看这本书:《程序员的自我修养:链接、装载与库》俞甲子,石凡,潘爱民著。
3 getrlimit and setrlimit functions
Advanced Programming in the UNIX Environment (1) 第一节有描述,链接: