unix高级编程--2(进程环境)

一、终止方式

正常终止:1、从main返回2.调用exit 3.调用_exit或_Exit 4.最后一个线程从启动例程返回 5.最后一个线程调用pthread_exit
异常终止:1、调用abort 2.接到一个信号 3.最后一个线程对取消做出响应
其中main函数返回一个整型值与调用exit等价,都会执行一个标准I/O库得清理关闭操作,对所有打开的流调用fclose函数

二、系统退出时自动调用函数atexit

一个进程可以登记多至32个函数,这些函数在exit时调用
int atexit(void(*func)(void));
调用顺序与注册顺序相反,同一函数可以注册多次

三、环境变量

每个进程都接收到一张环境变量表,都存在全局变量 extern char** environ,用于存储进程得环境表内容
环境变量函数
char* getenv(const char* name);
int putenv(char* str) 说明:str为name=value得形式
char* setenv(const char* name, const char* value, int rewrite);rewrite为非0则重写,
char* unsetenv(const char* name);


四、c程序存储空间布局

unix高级编程--2(进程环境)
正文段:cpu执行得机器命令部分。
初始化得数据:数据段,包含文件中显示得赋初值得变量。例如int max=30;
未初始化得数据:bss段,包含函数外未赋值得变量。例如int max;由内核同意赋值为0

 

五、存储空间分配函数 malloc calloc realloc函数跳转setjmp,longjmp

参照如下demo

static jmp_buf    jmpbuffer;
static int        globval;

int main(void)
{
    int                autoval;
    register int    regival;
    volatile int    volaval;
    static int        statval;

    globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5;

    if (setjmp(jmpbuffer) != 0) {
        printf("after longjmp:\n");
        printf("globval = %d, autoval = %d, regival = %d,"
            " volaval = %d, statval = %d\n",
            globval, autoval, regival, volaval, statval);
        exit(0);
    }

    /*
     * Change variables after setjmp, but before longjmp.
     */
    globval = 95; autoval = 96; regival = 97; volaval = 98;
    statval = 99;

    f1(autoval, regival, volaval, statval);    /* never returns */
    exit(0);
}

static void f1(int i, int j, int k, int l)
{
    printf("in f1():\n");
    printf("globval = %d, autoval = %d, regival = %d,"
        " volaval = %d, statval = %d\n", globval, i, j, k, l);
    f2();
}

static void f2(void)
{
    longjmp(jmpbuffer, 1);
}


说明:
setjmp,指定调转位置
longjmp ,开始跳转,第二个参数为setjmp得返回值
longjmp跳转后,静态变量和全局变量得值保持不变,自动变量和寄存器中得变量不确定,因此需要指定为volatite得属性

六、获取和设置进程限制信息 getrlimit和setrlimit

上一篇:UNIX环境高级编程 - 文件I/O - 读写/共享文件


下一篇:操作系统的发展史