UNIX环境高级编程读书笔记(七)—进程环境 (3)

8.

名称:

unstenv

功能:

删除环境变量

头文件:

#include <stdlib.h>

函数原形:

void unstenv(const char *name);

参数:

name  变量名

返回值:

 

 

 

 

 

 

 

 

unsetenv删除name的定义。即使不存在这种定义也不算出错。

 

/*7_6.c*/

#include <stdlib.h>

main()

{

char *p;

if((p=getenv(“USER=%s/n”,p);

    printf(“USER=%s/n”,p);

unsetenv(“USER”);

if(p=getenv(“USER=%s/n”,p));

    printf(“USER=%s/n”,p);

}

 

运行结果是:

# ./7_6

USER=li

 

9

名称:

clearenv

功能

清除环境变量

头文件

#include <stdlib.h>

函数原形

int clearenv(void);

参数

返回值

若成功则返回0,否则返回非0

 

 

 

 

 

 

 

 

环境表和环境字符串通常存放在进程空间的顶部,删除一个字符串很简单,但是增加一个字符串或修改一个现在的字符串就很困难。我们不能增加该空间的长度,如果我们想修改现有的name,并且新value的长度大于原长度,则必须调用malloc为新字符串分配空间,然后将新字符串复制到该空间中,接着使环境表中针对name的指针向新分配区。如果我们想增加一个新的name,并且实第一次增加,则必须调用malloc为新的指针表分配空间。接着将原来的分配表复制到新分配区,并将指向新name=value字符串的指针存放在指针表的表尾。如果不是第一次增加一个新name,可以调用realloc分配比原先多方一个指针的空间。然后将指向新name=value字符串的指针存放在该表表尾,后面跟着一个空指针。

 

六、跳转函数

10

名称:

setjmp

功能:

save stack context for non-local goto

头文件:

#include <stjmp.h>

函数原形:

int setjmp(jmp_buf env);

参数:

env  要跳转的位置

返回值:

若直接调用则返回0,若从longjmp调用返回则返回非0

 

 

 

 

 

 

 

 

11

名称:

longjmp

功能:

non-local jump to a saved stack context

头文件:

#include <setjmp.h>

函数原形:

void longjmp(jmp_buf env,int val);

参数:

env  从函数setjmp传递过来的要跳转的位置

val  返回给setjmp用于判断函数跳转

返回值:

 

 

 

 

 

 

 

 

setjmplongjmp都是对栈操作函数。setjmplongjmp函数用于函数调转,setjmp用于标记跳转后开始执行程序的位置。longjmp用于实现跳转。sejmp的参数env的类型是一个特殊类型jmp_buf。这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另外一个函数中引用env变量,所有规范的处理方式是将env变量定义为全局变量。因为一个程序可以实现多次跳转,setjmp不知道是哪个longjmp跳转的,所有需要一个参数来标记,这个参数就是val,它将成为从setjmp处返回的值。这样我们可以通过测试返回值的方法来判断是那一个longjmp跳转的。

 

下面是setjmp/longjmp的一个实例。

/*7_7.c*/

#include <setjmp.h>

#include <stdio.h>

 

main()

{

jmp_buf env;

int i;

int val;

 

if(setjmp(env)!=0)

{

    printf(“exit”);

    exit(0);

}

else

    priintf(“state”);

for(i=0i<10;i++)

{

    printf(“%d  “,i);

    if(i==5)

        longjmp(env,val);

}

}

 

执行结果为:state 0 1 2 3 4 5 exit

 

七、进程的资源限制

12.

名称:

getrlimit/setrlimit

功能:

获得和修改进程资源限制

头文件:

#include <sys/resoutce.h>

函数原形:

int getrlimit(int resource,struct rlimit *rlptr);

int setrlimit(int resource,const struct rlimit *rlptr);

参数:

   

返回值:

若成功返回0,若失败返回非0值。

 

 

 

 

 

 

 

 

 

 

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

rlimit 结构定义如下:

struct rlimit{

       rlim_t rlim_cur;

       rlim_t rlim_max;

};

更改资源限制时必须遵循下列限制:

任何一个进程都可以将一个软限制值改为小于或等于其硬限制值。

任何进程可以降低其硬限制值,但必须大于或等于其软限制值。这种操作对普通用户是不可逆的。

只有超级用户进程可以提高硬限制值。

 

 

文章转自:http://blog.chinaunix.net/u1/59291/showart.php?id=538571

你可能感兴趣的:(UNIX环境高级编程读书笔记(七)—进程环境 (3))