Unix 域套接字、管道与 FIFO

共 27 题
#

1. Unix 域套接字(AF_UNIX)相比 TCP loopback 省去了哪些协议栈处理,性能优势具体来自哪几层?

A AF_UNIX 省去 TCP/IP 栈与网络设备层处理,数据在内核内直接传递,延迟更低 ✓ 正确答案
B AF_UNIX 与 TCP loopback 性能完全相同
C AF_UNIX 需要走完整 IP 路由
D AF_UNIX 比 TCP loopback 延迟更高
#

2. SCM_RIGHTS 辅助数据如何在进程间传递文件描述符,内核在接收端对 fd 表做了怎样的操作?

A 接收端得到的是一个拷贝的独立文件
B SCM_RIGHTS 只能传 socket
C SCM_RIGHTS 通过辅助数据传递 fd,接收端在 fd 表分配新 fd 指向同一 file 对象 ✓ 正确答案
D 传递后发送端 fd 自动失效
#

3. 管道写入长度不超过 PIPE_BUF 时保证原子性,超过后原子性如何被破坏,多写者场景应如何规避交错?

A 超过 PIPE_BUF 仍原子,不会交错
B 任意长度写入都原子
C 写入不超过 PIPE_BUF 是原子的,超过可能与其他写者交错,需加锁或限制长度 ✓ 正确答案
D PIPE_BUF 与原子性无关
#

4. 命名管道(FIFO)与匿名管道在生命周期、命名方式以及无亲缘关系进程通信上有何差异?

A 匿名管道靠 fd 继承仅亲缘进程可用,FIFO 有名字靠路径访问,支持无亲缘进程 ✓ 正确答案
B 两者都无名
C 匿名管道可被任意进程打开
D FIFO 只能亲缘进程用
#

5. AF_UNIX 的抽象命名空间(abstract namespace)地址与文件系统路径地址有何区别,为何不占 inode 却随网络命名空间消亡?

A 抽象命名空间占 inode 且可见
B 抽象命名空间以 \0 开头,不占文件系统 inode,随网络命名空间消亡 ✓ 正确答案
C 路径地址不占 inode
D 抽象命名空间随文件系统存在
#

6. Unix 域流式套接字接收缓冲满时会阻塞发送方,这一背压特性与管道触发 SIGPIPE 的行为有何不同?

A SIGPIPE 表示缓冲满
B 缓冲满即触发 SIGPIPE
C AF_UNIX 流套接字无背压
D 缓冲满时阻塞发送方是正常背压,对端关闭时才触发 SIGPIPE ✓ 正确答案
#

7. socketpair 创建的成对套接字在 fork 后如何充当父子进程双向通道,相比两个管道有何便利?

A socketpair 无法用于父子进程
B socketpair 是单向的
C 需要两个 socketpair 才能双向
D socketpair 成对双向,fork 后各留一端形成双向通道,比两个单向管道更简洁 ✓ 正确答案
#

8. 为何传输大量数据时共享内存通常优于 Unix 域套接字,而控制消息与凭据传递仍首选 AF_UNIX?

A 大数据用共享内存(零拷贝),控制消息与凭据传递用 AF_UNIX(支持 SCM_RIGHTS/CREDENTIALS) ✓ 正确答案
B 共享内存支持传 fd 与凭据
C AF_UNIX 传大数据零拷贝
D 共享内存天然支持事件通知
#

9. AF_UNIX 的 SOCK_SEQPACKET 相比 SOCK_STREAM 保留每次 send 的报文边界且保证有序交付,适合哪些本地协议场景,报文超过接收缓冲时如何处理?

A SOCK_SEQPACKET 是字节流,无边界
B SOCK_SEQPACKET 保留报文边界且有序交付,超长报文会被截断,适合面向消息的本地协议 ✓ 正确答案
C 超长报文自动分段传输
D SOCK_SEQPACKET 不保证有序
#

10. AF_UNIX 数据报(SOCK_DGRAM)的单报文长度上限由什么决定,发送超限返回 EMSGSIZE 时应用应如何分片或改用流式套接字?

A 流式套接字有单报文上限
B 任何长度报文都可发送
C EMSGSIZE 表示对端关闭
D 报文上限由发送缓冲决定,超限返回 EMSGSIZE,可分片或改用流式套接字 ✓ 正确答案
#

11. AF_UNIX 流套接字的 SO_SNDBUF/SO_RCVBUF 如何影响背压阈值,与 TCP 的缓冲区自动调优有何不同,为什么本地场景更易出现缓存堆积?

A 缓冲越大越易触发背压
B AF_UNIX 有 TCP 式自动调优
C SO_SNDBUF/SO_RCVBUF 决定背压阈值,AF_UNIX 无 TCP 自动调优,本地快生产者易堆积 ✓ 正确答案
D 本地场景不会缓存堆积
#

12. listen() 的 backlog 在 AF_UNIX 流套接字上如何生效,accept 队列满时对端 connect 为何立即失败,Linux 上返回 EAGAIN 与 TCP 的 SYN 重传等待有何不同?

A accept 队列满时 AF_UNIX connect 立即返回 EAGAIN,而无 TCP 的 SYN 重传等待 ✓ 正确答案
B AF_UNIX connect 会像 TCP 一样 SYN 重传等待
C backlog 与队列满无关
D AF_UNIX 队列满时 connect 会无限等待
#

13. 向已关闭的 AF_UNIX 流或管道写入会触发 SIGPIPE 杀死进程,如何用 MSG_NOSIGNAL、signal 忽略或 SO_NOSIGPIPE 规避,各自的适用边界是什么?

A SO_NOSIGPIPE 是 Linux 特有
B MSG_NOSIGNAL 影响所有写操作
C MSG_NOSIGNAL 是 per-call(send 系列)、SO_NOSIGPIPE 是 per-socket、signal 忽略是进程级 ✓ 正确答案
D signal 忽略只影响特定 socket
#

14. sendfile 在 AF_UNIX 上是否能实现零拷贝,内核为何对本地套接字仍可能走缓存复制路径,与 TCP 上的 sendfile 有何差异?

A AF_UNIX 与 TCP 的 sendfile 完全一致
B AF_UNIX 上 sendfile 完全零拷贝
C AF_UNIX 不能使用 sendfile
D AF_UNIX 的 sendfile 可能走缓存复制路径,接收端需读入用户态,零拷贝收益有限 ✓ 正确答案
#

15. AF_UNIX 地址的 sun_path 为何限制为约 108 字节,抽象命名空间(首字节为 \0)与文件系统路径套接字在生命周期和权限上有何不同?

A 抽象命名空间受文件系统权限保护
B sun_path 长度无限
C sun_path 约 108 字节是历史限制,抽象命名空间无 inode 无权限随网络命名空间消亡,路径套接字有权限且需清理 ✓ 正确答案
D 路径套接字不占 inode
#

16. SCM_RIGHTS 传 fd 时内核如何管理引用计数,发送方与接收方各自的关闭顺序为何会影响对端 fd 的有效性,fd 泄漏如何排查?

A 发送方关闭后对端 fd 必然失效
B SCM_RIGHTS 传递使 file 对象引用 +1,只要一端持有引用则有效,未正确 close 会导致 fd 泄漏 ✓ 正确答案
C 接收端无需 close 收到的 fd
D fd 泄漏不影响资源释放
#

17. 匿名管道的默认容量(64KB)与 PIPE_BUF(4KB)原子写的关系是什么,fcntl(F_SETPIPE_SZ) 如何调整容量,上限受什么限制?

A F_SETPIPE_SZ 影响 PIPE_BUF
B PIPE_BUF 决定管道总容量
C 容量可无限增大
D 管道容量(默认 64KB)决定缓冲总量,PIPE_BUF(4KB)决定原子写长度,F_SETPIPE_SZ 调容量受 pipe-max-size 限制 ✓ 正确答案
#

18. fork 后父子进程若不关闭管道未使用端,为何会导致 read 永远阻塞或 SIGPIPE 延迟,select/poll 的 EOF 判断如何受影响?

A SIGPIPE 与写端引用无关
B 不关闭未用端不影响 EOF
C 不关闭未用端会使写端引用仍存在,read 不遇 EOF、SIGPIPE 延迟,fork 后应各关未用端 ✓ 正确答案
D read 始终返回 EOF 即便写端存在
#

19. netlink 与 AF_UNIX 在用户态与内核通信上的定位差异,为什么路由、邻居表等内核子系统使用 netlink 而非本地套接字?

A netlink 面向内核<->用户态通信,支持多播事件推送,路由/邻居等内核子系统用 netlink ✓ 正确答案
B AF_UNIX 用于内核<->用户态通信
C netlink 无法向内核推送事件
D 路由子系统用 AF_UNIX 通信
#

20. SO_PASSCRED 与 SCM_CREDENTIALS 如何让接收方获取对端 PID/UID/GID,常用于哪些鉴权场景?

A 凭据由发送方自报,不可靠
B SO_PASSCRED 获取的是网络地址
C SO_PASSCRED 使接收方通过 SCM_CREDENTIALS 获取对端 PID/UID/GID,用于基于身份的鉴权 ✓ 正确答案
D SO_PASSCRED 与 SO_PEERCRED 完全相同
#

21. AF_UNIX 抽象命名空间地址为何随网络命名空间隔离,路径名套接字受挂载命名空间影响,容器场景下应如何选择地址形式?

A 抽象命名空间随网络命名空间隔离,路径套接字受挂载命名空间影响,跨容器通信需考虑共享挂载点或改用其他 IPC ✓ 正确答案
B 抽象命名空间跨网络命名空间可见
C 路径套接字不受挂载命名空间影响
D 容器内必须用抽象命名空间
#

22. AF_UNIX 流套接字在 O_NONBLOCK 下写满返回 EAGAIN 而非阻塞,应用应如何结合 epoll 与部分写(partial write)处理背压?

A EAGAIN 表示发送成功
B 非阻塞下写满会阻塞
C 非阻塞下写满返回 EAGAIN,应用需处理部分写并用 epoll 的 EPOLLOUT 待缓冲腾出后继续发送 ✓ 正确答案
D 部分写无需处理,自动重发
#

23. SO_PEERCRED 与 SCM_CREDENTIALS 在获取对端身份上的差异,为何服务端应优先用 SO_PEERCRED 校验而非信任客户端自报身份?

A SCM_CREDENTIALS 由内核强制、不可伪造
B SO_PEERCRED 由内核提供对端凭据、可靠,SCM_CREDENTIALS 可被发送方自报、可能伪造,鉴权应优先用 SO_PEERCRED ✓ 正确答案
C SO_PEERCRED 可被客户端伪造
D 两者安全性相同
#

24. 高并发本地 IPC 选型,AF_UNIX、共享内存、io_uring 各自在吞吐、延迟与编程复杂度上的取舍,什么场景下共享内存仍不可替代?

A io_uring 无法做 I/O
B 共享内存替代一切 IPC
C AF_UNIX 灵活支持 fd/凭据,共享内存零拷贝高吞吐(大数据不可替代),io_uring 异步高性能 ✓ 正确答案
D AF_UNIX 吞吐高于共享内存
#

25. FIFO 的 open 为何默认阻塞直到对端打开,O_RDONLY/O_WRONLY 与 O_NONBLOCK 组合下 open 的返回行为分别是什么?

A FIFO open 从不阻塞
B FIFO 默认 open 阻塞等待对端,O_NONBLOCK 下读端立即成功、写端无读端返回 ENXIO ✓ 正确答案
C O_NONBLOCK 下写端永远成功
D 读端 open 无写端时失败
#

26. AF_UNIX 流套接字接收缓冲满时的背压与 TCP 有何不同,为什么本地写者会阻塞而不会像 UDP 一样静默丢包?

A AF_UNIX 流缓冲满时阻塞写者保证不丢包,UDP 缓冲满则静默丢包 ✓ 正确答案
B AF_UNIX 流缓冲满时丢包
C UDP 缓冲满时阻塞写者
D AF_UNIX 流与 UDP 行为相同
#

27. 如何用 ss -x 与 /proc/net/unix 排查 AF_UNIX 连接泄漏,连接数过多时的 inode 与内存占用如何评估?

A AF_UNIX 连接不会泄漏
B /proc/net/unix 不列 inode
C 用 ss -x 与 /proc/net/unix 查看连接与 inode,观察连接数增长并评估缓冲内存,修正未关闭连接 ✓ 正确答案
D ss -x 无法查看状态