# 家庭作业(续)
家庭作业 8.16(★)
下面这个程序的输出是什么?
#include "csapp.h"
int counter = 1;
int main()
{
if (fork() == 0) {
counter--;
exit(0);
}
else {
Wait(NULL);
printf("counter = %d\n", ++counter);
}
exit(0);
}
家庭作业 8.17(★)
列举练习题 8.4 中程序所有可能的输出。
家庭作业 8.18(★★)
考虑下面的程序:
#include "csapp.h"
void end(void)
{
printf("2");
fflush(stdout);
}
int main()
{
if (Fork() == 0)
atexit(end);
if (Fork() == 0) {
printf("0");
fflush(stdout);
}
else {
printf("1");
fflush(stdout);
}
exit(0);
}
判断下面哪个输出是可能的。注意:atexit 函数以一个指向函数的指针为输入,并将它添加到函数列表中(初始为空),当 exit 函数被调用时,会调用该列表中的函数。
A. 112002
B. 211020
C. 102120
D. 122001
E. 100212
家庭作业 8.19(★★)
下面的函数会打印多少行输出?用一个 n 的函数给出答案。假设 n ≥ 1。
void foo(int n)
{
int i;
for (i = 0; i < n; i++)
Fork();
printf("hello\n");
exit(0);
}
家庭作业 8.20(★★)
使用 execve 编写一个叫做 myls 的程序,该程序的行为和 /bin/ls 程序的一样。你的程序应该接受相同的命令行参数,解释同样的环境变量,并产生相同的输出。
ls 程序从 COLUMNS 环境变量中获得屏幕的宽度。如果没有设置 COLUMNS,那么 ls 会假设屏幕宽 80 列。因此,你可以通过把 COLUMNS 环境设置得小于 80,来检查你对环境变量的处理:
linux> setenv COLUMNS 40
linux> ./myls
.
. // Output is 40 columns wide
.
linux> unsetenv COLUMNS
linux> ./myls
.
. // Output is now 80 columns wide
.
家庭作业 8.21(★★)
下面的程序可能的输出序列是什么?
int main()
{
if (fork() == 0) {
printf("a");
fflush(stdout);
exit(0);
}
else {
printf("b");
fflush(stdout);
waitpid(-1, NULL, 0);
}
printf("c");
fflush(stdout);
exit(0);
}