APUE第七章学习笔记

前端之家收集整理的这篇文章主要介绍了APUE第七章学习笔记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一: 进程终止

/*********************************************************
退出函数:
包含头文件:  #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 Failed\n");
    return 0;
    }
    if  (atexit(gather))
    {
    printf("register gather Failed\n");
    exit(0);
    }

    if (atexit(clean))
    {
    printf("register clean Failed\n");
    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 error\n");
    exit(0);
    }

    printf("home起始目录: %s\n",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 error\n");
    exit(0);
    }

    char* exist;

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

    printf("环境变量Marco值是: %s\n",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; //硬限制值: 软限制值的最大值
}
函数说明:  得到或设置 软限制值和硬限制值 
*********************************************************/

猜你在找的Bash相关文章