《Linux编程基础》第六章习题

一、填空题

  1. 进程的属性保存在一个被称为(进程控制块)的结构体中,这个结构体中包括(进程标识符)、进程组、进程环境、进程的运行状态等。

  2. 进程在内存中可能会出现不同的状态,通常进程的转台被划分为 5 种:初始态、(就绪态)、(运行态)、(睡眠态)和终止态。

  3. Linux 系统中的进程结构类似属性结构,使用(pstree)命令可以查看当前系统中的进程树。进程树的顶端是进程(init),它是系统启动后创建的第一个进程。

  4. 调用 fork() 函数成功创建子进程后,父进程中的 fork() 函数会返回(子进程的pid),子进程中的 fork() 函数会返回(0)。

  5. 若在程序中通过如下所示的循环创建进程,循环结束后,会创建(32)个子进程。

    for(int i=0; i<5; i++) {
        pid = fork();
    }
    

二、判断题

  1. 进程是程序的一次执行过程。(√)
  2. exec 函数族的功能是:根据指定的文件名或路径找到可执行文件,用该文件取代调用该函数的进程中的程序,再从该文件的 main() 函数开始执行文件的内容。(√)
  3. 解决僵尸进程的方法是终止其父进程,使其变为孤儿进程。(√)
  4. fork() 函数执行后,系统会立刻为子进程复制一份父进程的资源。(×)
  5. 进程同步机制中的 waitpid() 函数和 wait() 函数用于使父进程阻塞等待子进程终止,将子进程进行回收,因此当父进程中调用了这两个函数时,就不会再有僵尸进程产生。(×)

三、单选题

  1. 在程序中调用 fork() 函数创建进程,父子进程会获取不同的返回值。下面关于 fork() 函数的说法错误的是:(B)

    A. 若子进程创建成功,父进程的 fork() 返回子进程 pid,子进程的 fork() 返回 0

    B. 若子进程创建成功,子进程的 fork() 返回子进程 pid,父进程的 fork() 返回 0

    C. 若子进程创建失败,父进程的 fork() 函数返回 -1

    D. 若子进程创建成功,子进程将从 fork() 函数调用处之后的代码开始执行

  2. 下列哪种方法无法查看进程的信息?(C)

    A. ps

    B. top

    C. kill

    D. 查看 /proc 目录

  3. 下列哪种方法可以等待接收进程号为 pid 的子进程的退出状态?(A)

    A. waitpid(pid, &status, 0)

    B. waitpid(pid, &status, WNOHANG)

    C. waitpid(-1, &status, 0)

    D. waitpid(-1, &status, WNOHANG)

  4. 从后台启动进程,应在命令后添加哪个符号?(A)

    A. &

    B. #

    C. *

    D. ~

四、简答题

  1. 简单说明程序和进程的区别。

    进程是一个二进制程序的执行过程,在程序执行时产生,但不是程序。程序是编译好的二进制文件,存放在磁盘上,不占用系统资源,是具体的;进程存在于内存中,占用系统资源,是抽象的。一次程序执行结束后,进程随之消失,进程所用的资源被系统回收。

  2. 分析程序,写出程序的执行结果。

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    int main() {
        pid_t pid1, pid2;
        if((pid1 = fork()) == 0) {
            sleep(3);
            printf("child process_1\n");
            exit(0);
            printf("child process_1\n");
        }
        else {
            if((pid2 = fork()) == 0) {
                sleep(1);
                printf("child process_2\n");
                return 0;
            }
            else {
                wait(NULL);
                wait(NULL);
                printf("info1 from parent process\n");
                printf("info2 from parent process\n");
                return 0;
            }
        }
        return 0;
    }
    
    child process_2
    child process_1
    info1 from parent process
    info2 from parent process
    

五、编程题

  1. 编写程序,在程序中创建一个子进程,使父子进程分别打印不同的内容。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main() {
        pid_t pid = fork();
        if(pid == -1) {
            perror("fork error");
            exit(1);
        }
        else if(pid > 0) {
            printf("parent process\n");
        }
        else if(pid == 0) {
            printf("child process\n");
        }
        return 0;
    }
    
  2. 编写程序,在程序中创建一个子进程,使子进程通过 exec 更改代码段,执行 cat 命令。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main() {
        pid_t pid = fork();
        if(pid == -1) {
            perror("fork error");
            exit(1);
        }
        else if(pid > 0) {
            sleep(1);
            printf("parent process\n");
        }
        else if(pid == 0) {
            printf("child process\n");
            execlp("cat", "-n", "/etc/passwd", NULL);
            perror("exec error");
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/ShadowBurn/article/details/87969628