众所周知,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 使用的方式相同)?
最佳答案
nginx 使用 unix 域套接字辅助消息(具体来说,SCM_RIGHTS
消息,有关详细信息,请参阅 man page for the unix protocol)来传递文件描述符。
当您收到SCM_RIGHTS
消息时,内核基本上会给您一个重复的(如dup
)文件描述符,在接收进程中有效。这个 fd 可能有也可能没有相同的号码,这并不重要,因为接收方应该使用消息的内容而不是一些先验知识。
关于c - 那么由 socketpair() 生成的套接字可以在不同的进程中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214477/