Linux进程间传递文件描述符:为什么不能用FIFO而要用Unix域套接字?
引言:文件描述符传递的挑战
在Linux系统编程中,进程间通信(IPC)是一个核心主题。当需要在进程间共享资源时,传递文件描述符(包括普通文件、socket等)成为常见需求。然而,许多开发者最初会尝试使用FIFO(命名管道)来实现这一功能,结果却发现这种方法行不通。本文将深入探讨文件描述符的本质,解释为什么FIFO不适合传递描述符,并详细介绍Unix域套接字的SCM_RIGHTS
机制如何正确解决这一问题。
第一部分:文件描述符的本质
1.1 描述符不是简单的整数
文件描述符(如3
、4
等)表面上是整数,但实际上它们是:
-
进程本地表的索引:每个进程有自己的描述符表
-
内核对象的引用:指向实际的文件、socket等内核资源
-
受进程隔离保护:不同进程的相同数字代表不同资源
c
// 错误尝试:直接传递描述符数值 int fd = open("file.txt", O_RDONLY); write(fifo_fd, &fd, sizeof(fd)); // 无效!
1.2 为什么简单传递数字失败
当接收方获得数字3
时:
-
该数字在接收进程中没有关联任何资源
-
内核没有参与资源转移<