APUE进程环境

pag147
main执行前:
  1. 调用一个特殊的启动例程
  2. 可执行程序文件将此启动例程指定为程序的起始地址
  3. 启动例程从内核取得命令行参数和环境变量值

void exit(int status);

void _Exit(int status);

void _exit(int status);

_exit和_Exit立刻进入内核,exit则先执行一些清理处理,然后进入内核。

echo $? 打印终止状态

int atexit(void (*func)(void));//终止处理程序,由exit调用,顺序与登记时相反

内核使程序执行的唯一方法是调用一个exec函数进程自愿终止的唯一方法是显式或隐式地(通过调用exit)调用_exit或_Exit

ISOC和POSIX.1都要求argv[argc]是一个空指针,则参数循环处理可写为:

for( i=0; argv[i] != NULL; i++ )


void *malloc(size_t size);

void *calloc(size_t nobj, size_t size);

void *realloc(void *ptr, size_t newsize);

void free(void *ptr);


sbrk扩充(或缩小)进程的堆

大多数malloc和free的实现都不减小进程的存储空间。释放的空间可供以后再分配,但通常将他们保持在malloc池中而不返回给内核。

alloca函数:在当前函数的栈帧上分配存储空间,而不是在堆中

优点:自动释放

缺点:增加栈帧长度,某些函数可能不支持


环境变量:

字符串格式:

name=value

export name=value

我们能影响的只是当前进程及调用进程的任何子进程的环境,但不能影响父进程的环境。

char *getenv(const char *name);//返回指向name=value字符串中的value

int putenv(char *str);//采取形式为name=value的字符串,将其放到环境表中,已存在则先删除

int setenv(const char *name, const char *value, int rewrite);//已存在,rewrite非0删除,0不删除

int unsetenv(const char *name);//删除name定义

putenv传递的是字符串地址,将存放在栈中的字符串作为参数传给该函数就会发生错误。


pag161

在栈上跳过若干栈帧

int setjmp(jmp_buf env);//env变量定义为全局变量

void longjmp(jmp_buf env, int val);//val 从setjmp返回的值

一个自动变量不想使其值回滚,则定义其为具有volatile属性,声明为全局变量或静态变量的值在执行longjmp时保持不变。


int getrlimit(int resource, struct rlimit *rlptr);//查询进程限制

int setrlimit(int resource, const struct rlimit *rlptr);//更改进程限制

进程的资源限制通常是在系统初始化时由进程0建立的,然后由每个后续进程继承。

资源限制影响到调用进程并由其子进程继承

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值