# APUE 第七章知识点:

发布时间 2023-04-09 07:12:32作者: 闲云潭影

APUE 第七章知识点:

  1. _exit 和 exit的区别
  • exit是标准输出当调用之后他将会调用 atexit 和 on_exit函数。exit在stdlib.h 文件中被定义。此函数会清除I/o和buffer
  • _exit 函数会立即执行退出 但是并不调用atexit 和on_exit函数。_exit在unistd.h文件中被定义,也不会清除I/O 和buffer
  1. 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函数
我们可以用这个函数来释放各种内存或者一些后续的操作。

  1. 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 */
}
  1. getrlimit and setrlimit function:
    这两个函数可以帮我们判定我们的程序占据了多少内存等等信息