欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

APUE:第七章:进程环境

程序员文章站 2024-01-31 12:19:52
...

7.6 C程序存储空间布局

APUE:第七章:进程环境
使用size命令可以查看某一个程序各个段的大小。
APUE:第七章:进程环境
通过下面的环境变量一节也可以看出环境变量处于高地址。
APUE:第七章:进程环境

7.7 共享库

APUE:第七章:进程环境
减少了可执行文件的长度,但是增加了运行时间的开销。
APUE:第七章:进程环境

7.8 存储器分配

#include <stdlib.h>
void* malloc(size_t size);
void* calloc(size_t nobj, size_t size);
void* realloc(void* ptr, size_t newsize);
//成功返回非空指针,失败返回null
void free(void* ptr);
  • malloc:内存不被初始化
  • calloc:内存会初始化,nobj为对象数量
  • realloc:在ptr的基础上重新分配内存,newsize是新的大小,可能会出现内存的搬移

APUE:第七章:进程环境
APUE:第七章:进程环境

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

int main()
{
    int size = 512;
    
    int* p = (int*)malloc(size*sizeof(int));
    if(p == NULL) {
        printf("allocate error\n");
        return -1;
    }

    int* pre = p;
    p = (int*)realloc(p, size*1000);
    
    if(p == NULL) {
        printf("allocate error\n");
        return -1;
    }
    
    printf("p = %p\n", p);
    printf("pre = %p\n", pre);
    if(p == pre)
        printf("did not move\n");
    else
    {
        printf("moved to other zone\n");
    }
    return 0;
}

运行结果:
APUE:第七章:进程环境

7.9 环境变量

先看环境表:
APUE:第七章:进程环境
与main函数的参数argv类似,也是指针数组,全局变量environ指向指针数组的第一个元素。

获取环境变量:

#include <stdlib.h>
char* getenv(const char* name);
//返回值:与name关联的环境变量字符串,未找到返回null

name的选项:
APUE:第七章:进程环境
例子:

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

int main(int argc, char** argv)
{
    char* env;
    char** arr;
    arr[0] = "HOME";
    arr[1] = "PATH";
    arr[2] = "SHELL";

    int i=0;
    for(i=0; i<3; i++) {
        if((env = getenv(arr[i])) != NULL) {
            printf("%s:\t%s\n", arr[i], env);
        }
    }
    return 0;
}

运行结果:
APUE:第七章:进程环境

设置环境变量:

#include <stdlib.h>
int putenv(char* str);
int setenv(const char* name, const char* value, int rewrite);
int unsetenv(const char* name);

APUE:第七章:进程环境

  • putenv(char* str)中的str要是name=value的形式;
  • setenv,如果rewrite不是0,则将原来的删除,如果rewrite是0,则不删除原来的,name也不会设置成新的value(奇怪);

7.10 setjmp和longjmp

goto语句不能跨越函数,也就是goto语句要在一个函数之内,函数间的跳转可以使用setjmp和longjmp。
APUE:第七章:进程环境

#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);

APUE:第七章:进程环境
jmp_buf env中存放的是调用longjmp时恢复状态的信息,val可以用来表示从哪进行的跳转。

相关标签: Linux