在Linux中,我能否打开一个套接字并将其传递给另一个进程?

52

在Linux中,我是否可以打开一个套接字并将其传递给另一个进程? 如果是,您能告诉我在哪里可以找到一个示例吗?

谢谢。


@Gilles'SO-stopbeingevil',您链接到一个在此问题之后按时间顺序提出的问题,它怎么可能是重复的? - SpectreVert
1个回答

67

可以使用sendmsg()SCM_RIGHTS从一个进程向另一个进程传递一组打开的文件描述符:

SCM_RIGHTS - 从另一个进程发送或接收一组打开文件描述符。数据部分包含文件描述符的整数数组。传递的文件描述符行为就像它们是使用dup(2)创建的。

http://linux.die.net/man/7/unix

尽管如此,这不是典型用法。更常见的情况是,进程从其父进程继承套接字(在fork()之后)。任何未关闭的文件句柄(包括套接字)都将对子进程可用。因此,子进程继承了父进程的套接字。

监听连接的服务器进程称为守护进程。这通常在每个新连接时进行分叉,并生成一个进程来处理每个新请求。以下是典型守护进程的示例:

http://www.steve.org.uk/Reference/Unix/faq_8.html#SEC88

向下滚动到void process()处。


19
除非你不想为每个请求派生一个新进程,而只是将请求传递给一组工作进程。 - magiconair
这似乎是针对AF_UNIX的特定内容。TCP套接字可以做到吗? - Adrian Ratnapala
14
不可以通过TCP将套接字(或文件句柄)发送到另一台机器,它们必须留在同一个内核中。因此,您通信的通道必须是AF_UNIX,但您传输的文件句柄当然可以是TCP套接字。 - Zarat
2
@Zarat,好的,自然而然地,你不能将它们发送到其他机器。我有点误解了,认为只有AF_UNIX套接字可以传输。这是我的疏忽 - 实际上手册写得非常清楚。 - Adrian Ratnapala
如果这两个进程也从套接字中读取数据,会发生什么? - Evren Bingøl
1
另一个很好的例子是,套接字被一个哨兵进程传递给其他进程,这个例子可以在 https://github.com/zimbatm/socketmaster 中找到。 - rajya vardhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接