正如我们所知,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使用的方式相同)?
http://swtch.com/usr/local/plan9/src/lib9/sendfd.c
nginx使用unix域套接字辅助消息(特别是SCM_RIGHTS
消息,有关此方面的更多信息,请参阅unix协议的手册页)来传递文件描述符。
当您收到SCM_RIGHTS
消息时,内核基本上会给您一个重复的(如dup
中的)文件描述符,在接收过程中有效。这个fd可能有也可能没有相同的数字,这无关紧要,因为接收方应该使用消息的内容,而不是一些先验知识。