apue 笔记 -第7章 进程环境

第七章 进程环境

内存布局

通过size 查看 text段,data段,bss段大小

kali@kali:~/Desktop/Linux Study/Hellos$ size /usr/bin/cc
   text    data     bss     dec     hex filename
 757686    8528   14512  780726   be9b6 /usr/bin/cc

获取环境变量 getenv

#include <stdlib.h>
#include "apue.h"
int main(int argc,char*argv[]){
    if(argc!=2)return -1;
    char* env = getenv(argv[1]);
    printf("env=%s",env);
    return 0;
}
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./GetEnv_7_9 PWD
env=/home/kali/Desktop/Linux Study/Hellos/Chaper 7
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./GetEnv_7_9 HOME
env=/home/kali
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./GetEnv_7_9 PATH
env=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

注意:环境变量表是放在栈之上的


C语言 goto语句-->函数内转跳

跨函数转跳-->setjump,longjump

存放在存储器中的变量(volatile)具有longjmp时的值,而在CPU和浮点寄存器中的变量则恢复为调用setjmp时的值

全局变量,静态变量和易失变量不受优化的影响

#include "apue.h"
#include <setjmp.h>

static void f1(int, int, int, int);
static void f2(void);

static jmp_buf jumpBuffer;
static int globalval;

int main(void)
{

    int autoval;
    register int regival;
    volatile int volaval;
    static int statval;

    globalval = 1;
    autoval = 2;
    regival = 3;
    volaval = 4;
    statval = 5;

    if (setjmp(jumpBuffer) != 0)
    {
        printf("after longjmp:\n");
        printf("glbalval = %d,autoval = %d,regival = %d,"
               "volaval = %d,statval = %d\n",
               globalval, autoval, regival, volaval, statval);
        exit(0);
    }

    globalval = 95;autoval = 96;regival = 97;volaval = 98;
    statval = 99;

    f1(autoval,regival,volaval,statval);
    exit(0);


}
static void f1(int i,int j,int k,int l){
    printf("in f1() :\n");
    printf("glbalval = %d,autoval = %d,regival = %d,"
           "volaval = %d,statval = %d\n",
           globalval, i, j, k, l);
    f2();
}

static void f2(void){
    longjmp(jumpBuffer,1);
}
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ gcc -o SetJump_7_13 SetJump_7_13.c apue.h 
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./SetJump_7_13                
in f1() :
glbalval = 95,autoval = 96,regival = 97,volaval = 98,statval = 99
after longjmp:
glbalval = 95,autoval = 96,regival = 3,volaval = 98,statval = 99

 优化编译:
 

kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ gcc -o SetJump_7_13 -O SetJump_7_13.c apue.h 
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./SetJump_7_13                
in f1() :
glbalval = 95,autoval = 96,regival = 97,volaval = 98,statval = 99
after longjmp:
glbalval = 95,autoval = 2,regival = 3,volaval = 98,statval = 99

查看系统资源限制 getrlimit()

#include "apue.h"
#include <sys/resource.h>

#define doit(name) pr_limits(#name,name)

static void pr_limits(char*,int);

int main(){

#ifdef RLIMIT_AS
    doit(RLIMIT_AS);
#endif

    doit(RLIMIT_CORE);
    doit(RLIMIT_CPU);
    doit(RLIMIT_DATA);
    doit(RLIMIT_FSIZE);
    doit(RLIMIT_NOFILE);

    #ifdef RLIMIT_NPROC
    doit(RLIMIT_NPROC);
    #endif

    #ifdef RLIMIT_NICE
    doit(RLIMIT_NICE);
    #endif

    #ifdef RLIMIT_SWAP
    doit(RLIMIT_SWAP);
    #endif

    doit(RLIMIT_STACK);
    

    exit(0);
}

static void pr_limits(char *name,int resource){

    struct rlimit limit;
    unsigned long long lim;

    if(getrlimit(resource,&limit)<0)
        printf("getrlimit err for %s",name);
    //左对齐且宽度为14的字符串代替
    printf("%-14s",name);

    if(limit.rlim_cur == RLIM_INFINITY)
        printf("(infinite) ");
    else{
        lim = limit.rlim_cur;
        printf("%10lld ",lim);
    }

    if(limit.rlim_max == RLIM_INFINITY)
        printf("(infinite) ");
    else{
        lim = limit.rlim_max;
        printf("%10lld ",lim);
    }

    putchar((int)'\n');

}
kali@kali:~/Desktop/Linux Study/Hellos/Chaper 7$ ./Getrlimit_7_16 
RLIMIT_AS     (infinite) (infinite) 
RLIMIT_CORE            0 (infinite) 
RLIMIT_CPU    (infinite) (infinite) 
RLIMIT_DATA   (infinite) (infinite) 
RLIMIT_FSIZE  (infinite) (infinite) 
RLIMIT_NOFILE       8192    1048576 
RLIMIT_NPROC        7703       7703 
RLIMIT_NICE            0          0 
RLIMIT_STACK     8388608 (infinite) 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值