全部博文(71)
分类: LINUX
2008-04-15 20:59:54
8.
名称:: |
unstenv |
功能: |
删除环境变量 |
头文件: |
#include |
函数原形: |
void unstenv(const char *name); |
参数: |
name 变量名 |
返回值: |
无 |
unsetenv删除name的定义。即使不存在这种定义也不算出错。
/*7_6.c*/ #include 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 |
函数原形: |
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 |
函数原形: |
int setjmp(jmp_buf env); |
参数: |
env 要跳转的位置 |
返回值: |
若直接调用则返回0,若从longjmp调用返回则返回非0。 |
11.
名称:: |
longjmp |
功能: |
non-local jump to a saved stack context |
头文件: |
#include |
函数原形: |
void longjmp(jmp_buf env,int val); |
参数: |
env 从函数setjmp传递过来的要跳转的位置 val 返回给setjmp用于判断函数跳转 |
返回值: |
无 |
setjmp和longjmp都是对栈操作函数。setjmp和longjmp函数用于函数调转,setjmp用于标记跳转后开始执行程序的位置。longjmp用于实现跳转。sejmp的参数env的类型是一个特殊类型jmp_buf。这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另外一个函数中引用env变量,所有规范的处理方式是将env变量定义为全局变量。因为一个程序可以实现多次跳转,setjmp不知道是哪个longjmp跳转的,所有需要一个参数来标记,这个参数就是val,它将成为从setjmp处返回的值。这样我们可以通过测试返回值的方法来判断是那一个longjmp跳转的。
下面是setjmp/longjmp的一个实例。
/*7_7.c*/ #include #include main() { jmp_buf env; int i; int val; if(setjmp(env)!=0) { printf(“exit”); exit(0); } else priintf(“state”); for(i=0;i<10;i++) { printf(“%d “,i); if(i==5) longjmp(env,val); } } |
执行结果为:state 0 1 2 3 4 5 exit
七、进程的资源限制
12.
名称:: |
getrlimit/setrlimit |
功能: |
获得和修改进程资源限制 |
头文件: |
#include |
函数原形: |
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;
};
更改资源限制时必须遵循下列限制:
一 任何一个进程都可以将一个软限制值改为小于或等于其硬限制值。
二 任何进程可以降低其硬限制值,但必须大于或等于其软限制值。这种操作对普通用户是不可逆的。
三 只有超级用户进程可以提高硬限制值。