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

标签 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

最佳答案

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

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

关于c - 那么由 socketpair() 生成的套接字可以在不同的进程中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214477/

相关文章:

c - 为什么要使用 define 关键字来定义函数

c - 在 C 中是否可能有一个结构或函数 union ?

c - 内存泄漏/GLib 问题

c - UNIX 域套接字 (PF_UNIX) 上的 send() 失败并出现 ENOBUFS 错误

java - 如何将进程文件描述符映射到java对象

linux - 系统调用如何知道文件描述符属于哪个进程?

在循环控制条件内调用 void 函数

mysql - MySQL 中的套接字和端口连接有什么区别?

delphi - Delphi 中的 SSL 套接字

android - openRawResourceFd 在安卓上失败