我们知道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使用的方式相同)?
答案 0 :(得分:3)
nginx使用unix域套接字辅助消息(具体来说,SCM_RIGHTS
消息,请参阅man page for the unix protocol以获取更多相关信息)来传递文件描述符。
当您收到SCM_RIGHTS
消息时,内核基本上会为您提供重复(如dup
)文件描述符,在接收过程中有效。这个fd可能有也可能没有相同的数字,这一点很少,因为接收方应该使用消息的内容而不是一些先验知识。