一、填空题
-
进程的属性保存在一个被称为(进程控制块)的结构体中,这个结构体中包括(进程标识符)、进程组、进程环境、进程的运行状态等。
-
进程在内存中可能会出现不同的状态,通常进程的转台被划分为 5 种:初始态、(就绪态)、(运行态)、(睡眠态)和终止态。
-
Linux 系统中的进程结构类似属性结构,使用(pstree)命令可以查看当前系统中的进程树。进程树的顶端是进程(init),它是系统启动后创建的第一个进程。
-
调用 fork() 函数成功创建子进程后,父进程中的 fork() 函数会返回(子进程的pid),子进程中的 fork() 函数会返回(0)。
-
若在程序中通过如下所示的循环创建进程,循环结束后,会创建(32)个子进程。
for(int i=0; i<5; i++) { pid = fork(); }
二、判断题
- 进程是程序的一次执行过程。(√)
- exec 函数族的功能是:根据指定的文件名或路径找到可执行文件,用该文件取代调用该函数的进程中的程序,再从该文件的 main() 函数开始执行文件的内容。(√)
- 解决僵尸进程的方法是终止其父进程,使其变为孤儿进程。(√)
- fork() 函数执行后,系统会立刻为子进程复制一份父进程的资源。(×)
- 进程同步机制中的 waitpid() 函数和 wait() 函数用于使父进程阻塞等待子进程终止,将子进程进行回收,因此当父进程中调用了这两个函数时,就不会再有僵尸进程产生。(×)
三、单选题
-
在程序中调用 fork() 函数创建进程,父子进程会获取不同的返回值。下面关于 fork() 函数的说法错误的是:(B)
A. 若子进程创建成功,父进程的 fork() 返回子进程 pid,子进程的 fork() 返回 0
B. 若子进程创建成功,子进程的 fork() 返回子进程 pid,父进程的 fork() 返回 0
C. 若子进程创建失败,父进程的 fork() 函数返回 -1
D. 若子进程创建成功,子进程将从 fork() 函数调用处之后的代码开始执行
-
下列哪种方法无法查看进程的信息?(C)
A. ps
B. top
C. kill
D. 查看 /proc 目录
-
下列哪种方法可以等待接收进程号为 pid 的子进程的退出状态?(A)
A. waitpid(pid, &status, 0)
B. waitpid(pid, &status, WNOHANG)
C. waitpid(-1, &status, 0)
D. waitpid(-1, &status, WNOHANG)
-
从后台启动进程,应在命令后添加哪个符号?(A)
A. &
B. #
C. *
D. ~
四、简答题
-
简单说明程序和进程的区别。
进程是一个二进制程序的执行过程,在程序执行时产生,但不是程序。程序是编译好的二进制文件,存放在磁盘上,不占用系统资源,是具体的;进程存在于内存中,占用系统资源,是抽象的。一次程序执行结束后,进程随之消失,进程所用的资源被系统回收。
-
分析程序,写出程序的执行结果。
#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
五、编程题
-
编写程序,在程序中创建一个子进程,使父子进程分别打印不同的内容。
#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; }
-
编写程序,在程序中创建一个子进程,使子进程通过 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; }