APUE:第七章:进程环境
程序员文章站
2024-01-31 12:19:52
...
7.6 C程序存储空间布局
使用size命令可以查看某一个程序各个段的大小。
通过下面的环境变量一节也可以看出环境变量处于高地址。
7.7 共享库
减少了可执行文件的长度,但是增加了运行时间的开销。
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是新的大小,可能会出现内存的搬移
#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;
}
运行结果:
7.9 环境变量
先看环境表:
与main函数的参数argv类似,也是指针数组,全局变量environ指向指针数组的第一个元素。
获取环境变量:
#include <stdlib.h>
char* getenv(const char* name);
//返回值:与name关联的环境变量字符串,未找到返回null
name的选项:
例子:
#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;
}
运行结果:
设置环境变量:
#include <stdlib.h>
int putenv(char* str);
int setenv(const char* name, const char* value, int rewrite);
int unsetenv(const char* name);
- putenv(char* str)中的str要是name=value的形式;
- setenv,如果rewrite不是0,则将原来的删除,如果rewrite是0,则不删除原来的,name也不会设置成新的value(奇怪);
7.10 setjmp和longjmp
goto语句不能跨越函数,也就是goto语句要在一个函数之内,函数间的跳转可以使用setjmp和longjmp。
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
jmp_buf env
中存放的是调用longjmp时恢复状态的信息,val可以用来表示从哪进行的跳转。
上一篇: Linux基本命令-01-目录管理
下一篇: [APUE]进程控制(上)