《unix环境高级编程》 读书笔记 (6)

目录: http://blog.csdn.net/alex_my/article/details/39346381

process environment


1 exit, _exit, _Exit and atexit

在解释前三个之前先说说这个:

#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) 第一节有描述,链接:

http://blog.csdn.net/alex_my/article/details/39079053














你可能感兴趣的:(《unix环境高级编程》 读书笔记 (6))