UNIX环境高级编程第七章

这一章主要知识点包括:程序启动与终止,进程终止exit与_axit,atexit函数。存储空间布局,深层嵌套出错跳出函数,资源查询与更改函数等内容。

1.首先从内核传递命令行参数和环境变量值给c启动例程,然后c启动例程调用main函数,main调用其他函数。终止时,

可以使用_exit()函数或者_Exit()函数,直接调用内核结束。也可以调用exit()函数,先进行清理处理。(调用各终止处

理程序,标准I/O清理程序),然后再进入内核。

2.exit函数先调用各终止处理程序,再调用标准I/O流清理关闭工作:为所有打开流调用fclose函数。这会使所有缓冲输出数据被冲洗。

3.未定义的终止状态:(1)调用exit类函数没带终止状态(2)main函数return没有返回值的(3)main函数没有声明返回类型为整型的。

4.【atexit函数】

登记由exit自动调用的终止处理程序的集合。atexit登记程序的顺序与exit执行调用的顺序相反。void atexit(void)

5.c语言的存储空间布局

正文段:cpu执行的机器指令部分。可共享不可修改只读的;

初始化数据段:程序中需明确地赋初值的变量。

非初始化数据段:bbs段,内核将此段中数据初始化为0或空指针。

栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。

堆:动态存储分配。

6.共享库:程序第一次执行或第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。

7.存储器分配函数

(1)malloc(2)calloc。分配若干个每个大小固定的存储空间。

(3)void *realloc(void *ptr, size_t newsize);//newsize是新的和旧的总长度

更改以前分配区的长度。如果往高位有足够的新分配空间,就直接在当前位置增加新空间。没有的话,

将当前内容与新分配内容一同放置到一个其他位置,删除原位置内容。所以不应分配指向他的指针

8.setjmp 与 longjmp

这是一组一同出现使用的函数。

setjmp函数确定的是出错之后返回到的main函数中的位置,longjmp是若出错,则从该longjmp处返回到main函数中的setjmp处。二者关联确定是同一组的标志是setjmp的参数与longjmp的第一个参数,需要是同样值,longjmp的第二个参数则用来区分其与setjmp相对应的longjmp里的不同出错位置,所以需要设定为不同整数值进行区分。

如果需要返回setjmp保存原来的值,就需要在变量前加volatile属性,优化执行就可以实现其值不回滚。

(1)volatile:作为关键字,确保本条指令不会应该编译器优化而忽略,而是每次直接读值。进行优化以后,volatile从寄存器取值,而不是存储器。

9.getrlimit和setrlimit函数:得到和设置资源限制。      

时间: 2024-10-15 22:02:00

UNIX环境高级编程第七章的相关文章

UNIX环境高级编程第11章线程

程序清单11-1打印线程ID // threads/threadid.c 11-1 #include "apue.h" #include <pthread.h> pthread_t ntid; void printids(const char* s) { printf("%d ", (unsigned int)ntid); printf("%ld ", (unsigned long)ntid); pid_t pid; pthread_

UNIX环境高级编程第10章信号10.3singal函数

// signals/sigusr.c 10-1 #include "apue.h" static void sig_usr(int); /* one handler for both signals */ int main(void) { if (signal(SIGUSR1, sig_usr) == SIG_ERR) { err_sys("can't catch SIGUSR1"); } if (signal(SIGUSR2, sig_usr) == SIG_E

UNIX环境高级编程第8章进程控制 8.3fork 文件共享 vfork

#include "apue.h" /* syj 20140112 */ int glob = 6; /* external variable in initialized data */ char buf[] = "a write to stdout\n"; int main(void) { int var; /* automatic variable on the stack */ pid_t pid; var = 88; if (write(STDOUT_FI

unix环境高级编程基础知识之第二篇(3)

看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位,它可以得到和改变打开文件的属性(只读,只写等等,注意后面和stat区别),下面记录了自己在学习的时候一些命令及概念,供学习使用: ls 命令的含义是list显示当前目录中的文件名字.注意不加参数它显示除隐藏文件外的所有文件及目录的名字. 1)ls –a 显示当前目录中的所有文件,包含隐藏文件. 2

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的