加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

APUE第七章学习笔记

发布时间:2020-12-15 16:22:03 所属栏目:安全 来源:网络整理
导读:一: 进程终止 / ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** **退出函数:包含头文件: #include stdlib.h 函数原型: void exit(int status); void _Exit(int status); 包含头文件: #include unistd.h 函数原型: void _exit(int statu

一: 进程终止

/*********************************************************
退出函数:
包含头文件:  #include <stdlib.h>
函数原型:       void exit(int status);
 void _Exit(int status);
包含头文件:  #include <unistd.h>
函数原型:   void _exit(int status);
函数说明: 用于正常终止程序,_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核
***********************************************************/
/***********************************************************
包含头文件:  #include <stdlib.h>
函数原型:   int atexit(void (*func)(void));
函数说明:    用于注册终止处理程序
注: exit调用终止处理程序顺序与注册顺序相反,同一函数登记多次,也会被调用多次
返回值:若成功,返回0,若出错,返回非0
***********************************************************/

vi 7.1.c

#include <stdlib.h>
#include <stdio.h>

// 终止程序假设执行 clean gather erase等操作

void clean()
{
    printf("程序已经终止,请让我来清理垃圾吧!n");
}

void gather()
{
    printf("垃圾清理完毕,让我来收集打包垃圾吧!n");
}

void erase()
{
    printf("垃圾打包完毕,让我来移除垃圾吧!n");
}

int main()
{
    if (atexit(erase))
    {
    printf("register remove failedn");
    return 0;
    }
    if  (atexit(gather))
    {
    printf("register gather failedn");
    exit(0);
    }

    if (atexit(clean))
    {
    printf("register clean failedn");
    exit(0);
    }
    return 0;
}
/*****************************************************
存储空间分配:
包含头文件:  #include <stdlib.h>
函数原型:   void *malloc(size_t size);
 void *calloc(size_t nobj,size_t size);
 void *realloc(void *obj,size_t size);
函数说明:  (1)  malloc: 分配size个字节的空间
 (2) calloc: 给指定长度对象分配空间,每个bit初始化为0
(3)  realloc : 分配size个字节的空间,并将obj移入分配空间内
返回值: 若成功,返回指针,若失败,返回NULL
 void free(void* ptr)
函数说明: 释放ptr指向的空间
********************************************************/
/*********************************************************
环境表:
每个程序都可以得到环境变量,进程接受到环境表,环境表是一个字符指针数组,Unix系统提供了全局变量
 char ** environ 指向该指针数组 
************************************************************/
/**************************************************************
包含头文件:  #include <stdlib.h>
函数原型:   char* getenv(const char* name);
函数说明: 得到环境变量name对应的value
返回值:  若找到,返回value的字符指针,若无,返回NULL
**********************************************************/
/*********************************************************
包含头文件:  #include <stdlib.h>
函数原型:   int putenv(char *str);
函数说明: 取形式为name = value的字符串,将其放到环境表,如果name已存在,则先删除其原来的定义
返回值: 若成功,返回0,若出错,返回非0
**********************************************************/
/********************************************************
包含头文件:  #include <stdlib.h>
函数原型:   int setenv(const char* name,const char* value,int rewrite);
函数说明: 增加或修改环境变量 name = value(若
rewrite非0,则删除其现有的定义;若rewrite为0,则不删除其现有定义(name 不设置为value,而且也不会出错)
返回值: 若成功,返回0,若失败,返回-1
***********************************************************/
/****************************************************
包含头文件:  #include <stdlib.h>
函数原型:   int unsetenv(const char* name);
函数说明:  删除环境变量name的定义,即使name不存在也不会出错
返回值:  若成功,返回-1
**********************************************/

vi 7.2.c

#include <stdio.h>
#include <stdlib.h>

int main()
{

    char* start_dir;

    if ((start_dir = getenv("HOME")) == NULL)
    {
    printf("getenv errorn");
    exit(0);
    }

    printf("home起始目录: %sn",start_dir);
    return 0;
}

vi 7.3.c

include <stdio.h>
#include <stdlib.h>

int main()
{
    char* envname = "Marco";
    char* envvalue = "帅哥";

    if (setenv(envname,envvalue,1) < 0)
    {
    printf("setenv errorn");
    exit(0);
    }

    char* exist;

    if ((exist = getenv(envname)) == NULL)
    {
    printf("环境变量不存在n");
    exit(0);
    }

    printf("环境变量Marco值是: %sn",envvalue);

    if (unsetenv(envname) < 0)
    {
    printf("删除Marco环境变量失败n");
    exit(0);
    }
    else
    printf("删除Marco环境变量成功n");
    return 0;
}

/***************************************************
包含头文件: #include

#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

#define IN_JMP 1
#define HANDLE_JMP 2
#define OUT_JMP 3

int in_error = 1;
int handle_error = 1;
int out_error = 1;
jmp_buf jmp;

// 假设程序步骤为 进入(in) 处理(handle) 出去(out)

void In()
{
    if (in_error)
    {
    longjmp(jmp,IN_JMP);
    }
    printf("In 完成n");
}

void Handle()
{
    if (handle_error)
    {
    longjmp(jmp,HANDLE_JMP);
    }
    printf("Handle 完成n");
}

void Out()
{
    if (out_error)
    {
    longjmp(jmp,OUT_JMP);
    }
    printf("Out 完成n");
}

int main()
{

    if (setjmp(jmp) == IN_JMP)
    {
    printf("进入出错n");
    in_error = 0;
    }

    In();
    if (setjmp(jmp) == HANDLE_JMP)
    {
    printf("处理错误n");
    handle_error = 0;
    }
    Handle();
    if (setjmp(jmp) == OUT_JMP)
    {
    printf("出去错误n");
    out_error = 0;
    }
    Out();
    return 0;
}
/*********************************************************
包含头文件:  #include <sys/resource.h>
函数原型:   int getrlimit(int resource,struct rlimit *rlptr);
 int setrlimit(int resource,struct rlimit *rlptr);
参数说明: int resource:由系统定义的一些资源限制种类
struct rlimit: struct rlimit
{
 rlim_t rlim_cur; //软限制值: 当前限制值
 rlim_t rlim_max; //硬限制值: 软限制值的最大值
}
函数说明:  得到或设置 软限制值和硬限制值 
*********************************************************/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读