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

简介: 目录: http://blog.csdn.net/alex_my/article/details/39346381 process environment 1 exit, _exit, _Exit and atexit 在解释前三个之前先说说这个: #include <stdlib.h> i
目录: 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) 第一节有描述,链接:















相关文章
|
Unix Linux C语言
计算机操作系统实验一 Unix/Linux编程开发环境
计算机操作系统实验一 Unix/Linux编程开发环境
168 0
|
6月前
|
Unix
Unix环境高级编程(第三版)中apue.h头文件及其依赖安装教程
Unix环境高级编程(第三版)中apue.h头文件及其依赖安装教程
117 0
|
Unix Shell Python
unix高级编程-fork和execve
unix高级编程-fork和execve
62 0
|
Ubuntu Unix Shell
unix高级编程-fork之后父子进程共享文件
unix高级编程-fork之后父子进程共享文件
64 0
|
Unix Linux
unix高级编程-僵尸进程和孤儿进程
unix高级编程-僵尸进程和孤儿进程
62 0
|
Unix Linux Shell
Unix/Linux环境使用(基础篇)(五)
Unix/Linux环境使用(基础篇)(五)
|
网络协议 安全 Ubuntu
Unix/Linux环境使用(基础篇)(四)
Unix/Linux环境使用(基础篇)(四)
|
Ubuntu Unix Linux
Unix/Linux环境使用(基础篇)(三)
Unix/Linux环境使用(基础篇)(三)
|
安全 Unix Linux
Unix/Linux环境使用(基础篇)(二)
Unix/Linux环境使用(基础篇)(二)
|
Ubuntu 安全 NoSQL
Unix/Linux环境使用(基础篇)(一)
Unix/Linux环境使用(基础篇)(一)