linux/unix系统编程手册 6章习题

定了个小计划,大概能2-3天看一章并做习题,这套书感觉也可能不会看完,实在太多了,看了1本之后估计后面当手册翻翻

这章环境那一些看的不太懂2333

6-1

编译程序清单6-1中的程序,使用ls -l命令显示可执行文件的大小,解释为什么可执行文件的大小远小于10MB,但是程序中包含了一个10MB的数组?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
char globBuf[65536];
int primes[] = {2, 3, 5, 7};
static int square(int x)
{
int result;
result = x * x;
return result;
}
static void doCalc(int val)
{
printf("The square of %d is %d\n", val, square(val));
if (val < 1000)
{
int t;
t = val * val * val;
printf("The cube of %d is %d\n", val, t);
}
}
int main(void)
{
static int key = 9973;
static char mbuf[10240000];
char* p;
p = malloc(1024);
doCalc(key);
exit(EXIT_SUCCESS);
}

编译后占用体积的部分主要是

char globBuf[65536];

至于

static int key = 9973;

static char mbuf[10240000];

未初始化的部分不分配空间,后面等程序加载器分配

6-2

编写程序,观察longjmp函数试图跳转到一个已经返回的函数中会出现什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
#include <setjmp.h>
#include <stdio.h>

jmp_buf env;

void x()
{
if (setjmp(env) == 0)
{
printf("1\n");
}
else
{
printf("2\n");
}
}

void y()
{
longjmp(env, 1);
printf("3\n");
}

int main(void)
{
x();
y();
printf("4\n");
return 0;
}

出现

1

2

4

原因书上有解释,尝试返回一个释放了的栈帧.
这个题按着书上 滥用longjmp()部分写就可以了

6-3

使用getenv()函数,putenv()函数来实现setenv()和unsetenv()函数。unsetenv函数需要将多个同名的环境变量都移除。