Unix环境高级编程读书笔记(5)

1、struct timespec
{
time_t tv_sec;//seconds
long tv_nsec;//nanoseconds
};


2、exit,_exit,_Exit,atexit;
前三个函数用于正常终止一个程序:_exit和_Exit立即进入内核;exit则先执行一些清理处理,然后返回内核
exit函数总是执行一个标准I/O库的清理关闭操作:对于所有打开流调用fclose函数,造成输出缓冲中的所有数据都被冲洗(写到文件上)
int atexit(void(*function)(void));
atexit:登记终止函数,即结束的时候由exit自动调用所注册的那些函数,ISO C规定,至少可以注册32个函数,这些函数被称为终止处理程序
exit调用这些注册函数的顺序与它们登记时候的顺序相反,同一个函数若被登记多次,也会被调用多次
与析构函数的调用关系:
在atexit(f)调用之前被静态分配的对象的析构函数将在f()的调用之后被调用。
在atexit(f)调用之后建立的对象的析构函数将在f()的调用之前被调用。
void _Exit(int status);
void exit(int status);
_exit:直接调用sys_exit终止一个进程,在sys_exit中,该进程所有打开的文件描述符关闭,子进程将被init进程继承,父进程收到一个SIGCHLD信号
_Exit:等同于_exit
exit:执行atexit(on_exit)注册的函数,刷新标准I/O流,然后调用sys_exit.


3、当内核执行c程序时,在调用main前,先调用一个特殊的启动例程,可执行程序文件将此启动例程指定为程序的起始地址,启动例程从内核获得命令行参数和环境变量值。


4、进程终止的方式
1)从main返回
2)调用exit
3)调用_exit或_Exit
4)最后一个线程从其启动例程返回
5)从最后一个线程调用pthread_exit
异常终止的方式
1)调用abort
2)接到一个信号
3)最后一个线程对取消请求做出响应


5、内核使程序执行的唯一方法是调用一个exec函数,当执行一个程序时,调用exec的进程可将命令行参数传递给新程序


6、每个程序都接收到一张环境表,该环境表也是一个字符指针数组;全局变量environ则包含了该指针数组的地址 extern char**environ


7、未初始化数据段的内容并不存放在磁盘程序文件中,其原因是,内核在程序开始运行前将它们都设置为0;需要存放在磁盘程序文件中的段只有正文段和初始化数据段。


8、共享库使得可执行文件中不再需要包含公用的库函数,而只需在所有进程都可引用的存储区中保存这种库例程的一个副本,程序第一次执行或者第一次调用某个库函数时,用动态链接的方法将程序与共享库函数相链接,这减少了每个可执行文件的长度;共享库的另一个优点是可以用库函数的新版本代替老版本而无需对使用该库的程序重新连接编辑。


9、
void* malloc(size_t size);
void* calloc(size_t nobj,size_t size);
void* realloc(void*ptr,size_t newsize);
malloc:分配指定字节数的存储区,此存储区中的初始值不确定
calloc:为指定数量指定长度的对象分配存储空间,该空间中的每一位都初始化为0
realloc:增加或减少以前分配区的擦汗高难度,当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定;如果在该存储区后有足够的空间可供扩充,则可在原存储区位置向高地址方向扩充,无需移动任何原先的内容,如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,将现有内容复制到新分配的存储区,然后释放原存储区,返回新分配区的指针。
释放的空间可供以后再分配,但将它们保持在malloc池中而不返回给内核,大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息------分配块的长度、指向下一个分配块的指针。


10、我们能影响的只是当前进程及其后生成和调用的任何子进程的环境,但不能影响父进程的环境。


11、非局部的goto---setjmp和longjmp函数,非局部指的是:这不是由普通的c语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。
int setjmp(jmp_buf env);
void longjmp(jmp_buf env,int val);
以上两个函数是结合使用:在希望返回到的位置调用setjmp,env是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息,第二个参数将成为setjmp函数的返回值,通过把longjmp中的val值设置为不同的值,从而测试setjmp的返回值来确定是从哪一个函数goto过来的,在第一次调用setjmp时返回值是0,所以longjmp中的val值最好不要设置为0。
全局变量、静态变量和易失变量(volatile)不受优化影响,在longjmp之后,它们的值时最近锁呈现的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值