APUE学习笔记——第七章 进程环境

1、main函数

原型:int main(int argc, char *argv[])  其中argc是命令行参数的数目,argv是指向参数的各个指针构成的数组。

main函数的命令行参数代码如下:

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

int main(int argc,char *argv[]){
    int i;
    for(i = 0 ; i < argc ; i ++)
        printf("argv[%d]: %s\n",i,argv[i]);
    return 0;
}
执行样例:

./7_1_main main test
argv[0]: ./7_1_main
argv[1]: main
argv[2]: test

2、进程终止

正常终止包括:(1)从main返回,(2)调用exit;(3)调用_exit或者_Exit;(4)最后启动一个线程从其启动例程返回;(5)最后一个线程调用pthread_exit。

异常终止包括:(1)调用abort();(2)接收到一个信号并终止;(3)最后一个线程对取消请求做出响应。
a、exit函数系列:_exit和_Exit函数立即进入内核,而exit函数则执行清理处理(如关闭标准I/O流,执行各终止处理程序)。在main函数执行return (0)与exit(0)是等价的。

#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);

个人认为使用exit和return比较好。

b、atexit函数

用来登记终止处理程序,一个进程可以登记多达32个函数,这些函数将有exit自动调用,调用顺序与登记顺序相反,同一个函数可以登记多次,则也会被调用多次。

调用和登记是用栈来存储的,先进后出原则。

#include <stdlib.h>

int atexit(void (*func) (void))


3、环境表

想得到UNIX环境表的方式如下:

extern char **environ;

while(*environ != NULL)
         puts(*environ++);

这样和在Linux环境下执行env命令得到的结果是一样的,这里没啥好说的。

4、环境变量

由上述的环境表如果想得到某个参数的具体值可以使用如下函数:

#include <stdlib.h>
char *getenv(const char *name); //指向与name关联的value的指针,若未找到返回NULL
int putenv(char *string);  //取形式为name=value的字符串,将其放到环境表中
int setenv(const char *name, const char *value, int rewrite); //将name设置为value,若rewrite为0则不删除现有的定义,rewrite非0则删除其现有的定义
int unsetenv(const char *name);  //删除name的定义
int clearenv(void); //删除环境表中所有项

5、存储器分配

即动态内存分配,有三个函数:

a、malloc,分配指定字节的空间(常用)

b、calloc,为指定数量具有指定长度的对象分配存储空间,该空间中每一位初始化为0

c、realloc更改以前分配区的长度

#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr, size_t newsize);

void free(void *ptr);//释放内存空间

6、setjmp和longjmp函数

在C语言中goto语句只能在函数内部跳转,而setjmp和longjmp可以跨越函数。

#include <setjmp.h>
int setjmp(jmp_buf env);//返回值为0为直接调用,从longjmp调用返回为非0值
int longjmp(sigjmp_buf env, int val);

这里的例子建议去看教材。

本章最后还有个资源限制,不知为何物,不说了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章