家庭作业(续)

家庭作业(续)

家庭作业 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);
}