一、选择题(每题2分,总分30分)
1. 下列不是用户进程的组成部分的是( D )
[A] 正文段 [B] 用户数据段 [C] 系统数据段 [D] elf段
根据进程的基本概念,进程是由正文段、用户数据段以及系统数据段共同组成的一个执行环境。其中:
- 正文段(也称为代码段):存放被执行的机器指令,这部分是只读的,允许正在运行的两个或多个进程之间共享这一代码。
- 用户数据段:存放进程在执行时直接进行操作的所有数据,包括进程使用的全部变量在内,这部分的信息可以被改变。每个进程需要有自己的专用用户数据段。
- 系统数据段:有效地存放程序运行的环境,包括进程的控制信息等。
选项D中的"elf段"。ELF(Executable and Linkable Format)是一种用于可执行文件、目标代码、共享库以及核心转储的标准文件格式。虽然ELF文件与进程的执行有关,但"elf段"本身并不是用户进程的组成部分。
【正确答案:[D] elf段】
2. 以下哪种不是进程的类型 ( )
[A] 批处理进程 [B] 管理进程 [C] 交互进程 [D] 守护进程
回顾一下进程的类型:
- [A] 批处理进程:这是与Windows原来的批处理类似的进程,是一个进程序列,负责按照顺序启动其他进程。
- [C] 交互进程:这是由shell启动的进程,既可以在前台运行,也可以在后台运行。在执行过程中,它要求与用户进行交互操作。
- [D] 守护进程:这是执行特定功能或执行系统相关任务的后台进程。它不是内核的组成部分,但在系统启动时可能启动,并在系统关闭前持续运行。
选项B:管理进程。
在操作系统的上下文中,虽然有一个进程管理系统(负责创建、调度、终止进程等),但“管理进程”本身并不是一个特定的进程类型。它是一个更广泛的概念,涉及多个进程和组件,用于管理系统的各种资源。
【正确答案:[B] 管理进程】
3. 如果umask的值为022,创建文件时指定的权限是775,则该文件的实际权限为 ( )
[A] 755 [B] 722 [C] 753 [D] 022
在Unix和类Unix系统中,
umask
是一个用于控制新创建文件和目录权限的遮罩值。当创建一个新文件或目录时,系统会使用你指定的权限(如775
对于文件或777
对于目录)与umask
值进行按位与的反操作(即AND NOT
或~AND
)来确定最终的权限。首先,解释给定的权限和
umask
值:
- 文件指定的权限:
775
(二进制为111 111 101
)umask
的值:022
(二进制为000 010 010
)使用按位与的反操作来确定最终权限:
- 对于用户(owner)权限:
111 AND NOT 000 = 111
(即7)- 对于组(group)权限:
111 AND NOT 010 = 101
(即5)- 对于其他用户(others)权限:
101 AND NOT 010 = 101
(即5)【正确答案: [A] 755】
4. 用open( )创建新文件时,若该文件存在则可以返回错误信息的参数是 ( )
[A] O_CREAT [B] O_EXCL [C] O_TRUNC [D] O_NOCTTY
在Unix和类Unix系统的
open()
系统调用中,要创建新文件或打开已存在的文件,并希望在文件已存在时返回错误信息,你需要使用特定的标志组合。
- [A]
O_CREAT
:如果文件不存在,则创建它。如果文件已存在,则此选项不产生任何效果。- [B]
O_EXCL
:与O_CREAT
一起使用时,如果文件已存在,则调用失败并返回错误。- [C]
O_TRUNC
:如果文件存在且为普通文件,并且成功打开以进行写操作或读/写操作,则将其长度截断为零。此选项对打开已存在的文件有影响,但它不会阻止文件被打开。- [D]
O_NOCTTY
:如果路径名指向终端设备,则不要将该设备分配为进程的控制终端。这与文件是否已存在无关。因此,要在文件已存在时返回错误信息,你需要使用
O_CREAT
和O_EXCL
这两个标志的组合。但根据题目要求,单独的标志是O_EXCL
。【正确答案: [B] O_EXCL】
5. 如果键盘输入为abcdef,程序如下所示,打印结果应该是( )
char buffer[6];
……
fgets(buffer, 6, stdin);
printf(“%s”, buffer);
[A] abcde [B] abcdef [C] abcdef 后出现乱码 [D] 段错误
首先,理解
fgets
函数的工作原理。fgets
函数从指定的流(在这个例子中是stdin
)中读取一行,并将其存储在提供的缓冲区中,直到遇到换行符('\n')、EOF或达到指定的最大字符数(包括空字符'\0')。给定的代码片段中,
fgets(buffer, 6, stdin);
尝试从stdin
读取最多5个字符(因为缓冲区大小为6,但还需要一个位置来存储字符串的结束符'\0')并存储在buffer
数组中。现在,键盘输入为
abcdef
:
fgets
会读取前5个字符('a', 'b', 'c', 'd', 'e')并存储在buffer
中。fgets
会在字符串的末尾添加一个空字符'\0'来标记字符串的结束。- 然后,
printf(“%s”, buffer);
会打印出存储在buffer
中的字符串,即abcde
。由于
fgets
在读取5个字符后遇到换行符('\n')之前就已经达到了最大字符数,所以换行符不会被读取到buffer
中,因此输出中也不会包含换行符或任何其他额外的字符(如选项C中的乱码)。另外,由于缓冲区足够大来存储输入的字符串和结束符,所以也不会出现段错误(如选项D)。
【正确答案: [A] abcde】
6. 下列哪个函数无法传递进程结束时的状态 ( )
[A]close [B] exit [C] _exit [D] return
首先,理解这些函数在Unix和类Unix系统中的用途和上下文。
- [A]
close
:这个函数用于关闭一个文件描述符。它并不涉及进程的结束或状态传递。- [B]
exit
:这个函数用于终止调用它的进程,并返回一个状态值给父进程。父进程可以通过wait()
或waitpid()
等系统调用来获取这个状态值。- [C]
_exit
:这个函数也用于终止进程,但它不会执行标准I/O清理(如刷新缓冲区)。它也会返回一个状态值给父进程。- [D]
return
:在main函数中,return
语句用于结束程序并返回一个状态值给操作系统(实际上是传递给父进程)。在非main函数中,return
只返回给调用它的函数。分析这些选项:
- [A]
close
显然与进程结束时的状态传递无关。- [B]
exit
和 [C]_exit
都可以传递一个状态值给父进程。- [D]
return
在main函数中也可以传递一个状态值给操作系统(实际上是父进程)。但是,如果
return
在非main函数中使用,它就不会传递进程结束时的状态给父进程,因为它只是返回给调用它的函数。但题目没有明确说return
是在哪个函数中使用,所以我们假设它是在main函数中使用的。然而,从题目的语境来看,我们是在寻找一个“无法传递进程结束时的状态”的函数,而这个函数就是[A]
close
。【正确答案: [A]close】
7. 以下哪种用法可以等待接收进程号为pid的子进程的退出状态 ( )
[A] waitpid(pid, &status, 0) [B] waitpid(pid, &status, WNOHANG)
[C] waitpid(-1, &status, 0) [D] waitpid(-1, &status, WNOHANG)
在给出的选项中,要等待接收进程号为
pid
的子进程的退出状态,应该使用waitpid
函数并指定正确的参数。
- [A]
waitpid(pid, &status, 0)
:这个用法会阻塞父进程,直到进程ID为pid
的子进程结束,并将子进程的退出状态保存在status
指向的变量中。这是符合题目要求的。- [B]
waitpid(pid, &status, WNOHANG)
:这个用法使用WNOHANG
选项,它会使waitpid
在子进程没有结束时立即返回。这意味着父进程不会被阻塞,但可能无法立即获取子进程的退出状态。- [C]
waitpid(-1, &status, 0)
:这个用法会阻塞父进程,直到任意一个子进程结束。因为指定了-1
作为进程ID,所以它会等待任何子进程。- [D]
waitpid(-1, &status, WNOHANG