第七章 进程环境
内存布局
通过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)