那么由 socketpair() 生成的套接字可以在不同的进程中使用吗?
我们知道fd(文件描述符,准确地说是int)是每个进程的,也就是说,在不同进程中打开的同一个文件可能有不同的fd< /代码>。
我认为套接字也应该如此。
但是在阅读 nginx 源代码时,我发现它使用套接字在进程之间进行通信:
if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)
{
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"socketpair() failed while spawning \"%s\"", name);
return NGX_INVALID_PID;
}
这里 ngx_processes[s].channel[0]
被发送到其他进程。
但是正如我所说的fd
是每个进程的,它如何确保相同的int
将指向相同的套接字?
更新
为什么现在的问题是它是如何工作的(与 nginx 使用的方式相同)?
As we know fd
(file descriptor,an int
to be exact) is per process,that is,the same file opened in different processes may have different fd
.
And I thought so should be for sockets.
But when reading nginx source code I found it's using sockets to communicate between processes:
if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)
{
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"socketpair() failed while spawning \"%s\"", name);
return NGX_INVALID_PID;
}
Here ngx_processes[s].channel[0]
is sent to other process.
But as I said fd
is per process,how can it ensure that the same int
will point to the same socket?
UPDATE
Why question is now how this works(it's the same way that nginx uses)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
nginx 使用 unix 域套接字辅助消息(具体来说,
SCM_RIGHTS
消息,请参阅 UNIX 协议的手册页 了解更多信息)来传递文件描述符。当您收到
SCM_RIGHTS
消息时,内核基本上会为您提供一个重复的(如dup
)文件描述符,在接收进程中有效。该 fd 可能有也可能没有相同的编号,这无关紧要,因为接收方应该使用消息的内容而不是一些先验知识。nginx uses unix domain sockets ancillary messages (specifically, the
SCM_RIGHTS
message, see the man page for the unix protocol for more information on this) to pass file descriptors around.When you receive an
SCM_RIGHTS
message, the kernel basically gives you a duplicate (as indup
) file descriptor, valid in the receiving process. This fd may or may not have the same number, which matters very little as the receiving side should use the contents of the message and not some prior knowledge.