那么socketpair()生成的套接字可以在不同的进程中使用吗?

时间:2011-06-02 12:26:34

标签: c sockets file-descriptor

我们知道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

1 个答案:

答案 0 :(得分:3)

nginx使用unix域套接字辅助消息(具体来说,SCM_RIGHTS消息,请参阅man page for the unix protocol以获取更多相关信息)来传递文件描述符。

当您收到SCM_RIGHTS消息时,内核基本上会为您提供重复(如dup)文件描述符,在接收过程中有效。这个fd可能有也可能没有相同的数字,这一点很少,因为接收方应该使用消息的内容而不是一些先验知识。