APUE 第七章知识点:
- _exit 和 exit的区别
- exit是标准输出当调用之后他将会调用 atexit 和 on_exit函数。exit在stdlib.h 文件中被定义。此函数会清除I/o和buffer
- _exit 函数会立即执行退出 但是并不调用atexit 和on_exit函数。_exit在unistd.h文件中被定义,也不会清除I/O 和buffer
- atexit:
atexit 将注册最多32个函数。 当调用exit的时候atexit也会调用被注册的函数。注意先注册的函数最后执行。后注册的函数先被执行。
例子:
#include <stdio.h>
#include <stdlib.h>
void cleanup(void) {
printf("Cleaning up...\n");
}
int main() {
// Register exit handler
atexit(cleanup);
printf("Hello, World!\n");
// Exit program normally
exit(0);
}
其中clean up函数被atexit注册。当执行完hello world之后就会执行cleanup函数
我们可以用这个函数来释放各种内存或者一些后续的操作。
- setjmp, longjmp:
看下面的例子:
当cmd_add 里面发生错误jmpbuffer 变成了1 会立即跳回setjmp函数然后打印出结束。
#include "apue.h"
#include <setjmp.h>
#define TOK_ADD 5
jmp_buf jmpbuffer;
int
main(void)
{
char line[MAXLINE];
if (setjmp(jmpbuffer) != 0)
printf("error");
while (fgets(line, MAXLINE, stdin) != NULL)
do_line(line);
exit(0);
}
. . .
void
cmd_add(void)
{
int token;
token = get_token();
if (token < 0) /* an error has occurred */
longjmp(jmpbuffer, 1);
/* rest of processing for this command */
}
- getrlimit and setrlimit function:
这两个函数可以帮我们判定我们的程序占据了多少内存等等信息