CSAPP3e-学习笔记-第十章


Linux 系统下的 I/O 进程,其标准输出描述符的值是(B)
A. $0$
B. $1$
C. $2$
D. $-1$


在头文件中,标准输出描述符所对应的预定义常量是(B)
A. STDIN_FILENO
B. STDOUT_FILENO
C. STDERR_FILENO
D. STDFILE_FILENO

每个 C 程序开始时都有三个打开的流(在 stdio.h 中定义)

  • stdin (standard input) 标准输入
  • stdout (standard output) 标准输出
  • stderr (standard error) 标准错误
1
2
3
4
5
6
7
8
#include <stdio.h>
extern FILE *stdin; /* standard input (descriptor 0) */
extern FILE *stdout; /* standard output (descriptor 1) */
extern FILE *stderr; /* standard error (descriptor 2) */

int main() {
printf(stdout, "Hello, world\n");
}

Linux系统中文件类型包含下面哪些?(A B C D)
A. 普通文件
B. 目录
C. 套接字
D. 符号链接

每个 Linux 文件都有一个类型来表明它在系统中的角色:

类型 英语 作用
普通文件 Regular file 包含任意数据
套接字 Socket 用来与另一个进程进行跨网络通信的文件
目录 Directory 一组链接文件的索引
命名通道 Named pipes (FIFOs)
符号链接 Symbolic links
字符和块设备 Character and block devices

要读取某个目录的内容,应该使用函数(A B C)
A. opendir
B. readdir
C. closedir
D. writedir

文件描述符

在 Linux 下一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,它是一个非负整数,用于指代被打开的文件。所有执行 I/O 操作的系统调用都是通过文件描述符完成的。而系统调用函数 open 的返回值就是文件描述符 fd

1
2
3
4
5
6
7
8
9
10
11
//  打开文件 -> 返回:若成功则为新文件描述符,若出错为-1。 
int open(char *filename, int flags, mode_t mode);

// 关闭文件 -> 返回:若成功则为0,若出错为-1。
int close(int fd);

// 读文件 -> 返回:若成功则为读的字节数,若 EOF 则为0,若出错为-1。
ssize_t read(int fd, void *buf, size_t n);

// 写文件 -> 返回:若成功则为写的字节数,若出错为-1。
ssize_t write(int fd, const void *buf, size_t n);

普通文件

  • 普通文件包含任意数据
  • 应用程序常常要区分文本文件(text files)和二进制文件(binary files)
    • 文本文件是只包含 ASCII 或 Unicode 字符的普通文件
    • 二进制文件是所有其他文件
      • 比如目标文件,JPEG 图像文件等等
    • 内核并不知道两者之间的区别
  • Linux 文本文件是文本行的序列
    • 文本行是一个字符序列,以一个新行符 (\n)结束
      • 新行符为 0xa,与 ASCII 的换行符 (LF) 是一样的
  • 其他系统中的行结束标志
    • Linux 和 Mac 操作系统 : \n (0xa)
      • 换行 (LF)
    • Windows 和 因特网络协议: \r\n (0xd 0xa)
      • Carriage return (CR) followed by line feed (LF) 回车换行

目录

  • 目录是包含一组链接的文件
    • 每个链接将一个文件名映射到一个文件
  • 每个目录至少含有两个条目
    • . 是到该目录自身的链接
    • .. 是到目录层次结构中父目录的链接

如何使用 dup2 将标准输入重定向到描述符5?(A)
A. dup2(5, 0)
B. dup2(0, 5)
C. dup2(1, 5)
D. dup2(5, 1)

dup2(oldfd, newfd)函数

复制描述符表表项 oldfd 到描述符表表项 newfd, 覆盖描述符表表项 newfd 以前的内容。

调用 dup2(4, 1):使得 fd = 1 (stdout) 指向 fd = 4 所指向的磁盘文件。

dup2(A, B) == 复制描述符 A 到描述符 B == 描述符 B 指向描述符 A


CSAPP3e-学习笔记-第十章
https://luoyuy.top/posts/b9e87311a79b/
作者
LuoYu-Ying
发布于
2023年2月19日
许可协议