为什么 socketpair() 返回 2 个套接字?

Why does socketpair() return 2 sockets?

提问人:Le Young 提问时间:9/28/2023 最后编辑:Le Young 更新时间:9/29/2023 访问量:59

问:

socketpair()几乎总是与 一起使用。它返回 2 个套接字,在调用 之后,我们得到了 4 个套接字。在我见过的大多数示例中,每个进程中的两个套接字中的一个被关闭,另一个紧随其后被保留。似乎总是有 2 个无用的插座。鉴于这种情况,为什么不直接返回一个连接到自身的套接字呢?这样,在调用 之后,每个套接字都在使用中。fork()fork()fork()sockpair()fork()

是否有返回连接到自身的套接字的等效项?socketpair()

如果不是,是因为这样的套接字不可能(或容易)实现吗?

如果可能,我该如何实现?

编辑:我认为这个问题与 C/Unix 中的 Socketpair() 不同。 它没有解释为什么总是有 2 个无用的套接字需要关闭。

Linux 套接字 IPC

评论

0赞 Iłya Bursov 9/28/2023
这回答了你的问题吗?C/Unix 中的 socketpair()
0赞 Le Young 9/28/2023
@I łyaBursov 我认为这个问题与 C/Unix 中的 Socketpair() 不同。它没有解释为什么总是有 2 个无用的套接字需要关闭。
2赞 Iłya Bursov 9/28/2023
它们并非无用,它们代表管道的不同端,而通常您关闭其中一个 - 这不是唯一的用例,例如,您可以在同一进程中继续使用两个套接字,这在链接的问题中进行了解释
0赞 Le Young 9/29/2023
@I łyaBursov 我知道它们是可用的,但在大多数情况下它们不会被使用。为简单起见,一个插座就可以了。不是吗?
3赞 Ben Voigt 9/29/2023
fork()不会创建新的套接字。它复制同一套接字的文件描述符。

答:

1赞 Serge Ballesta 9/29/2023 #1

我认为根本原因是 的概念取自 .管道是单向通道,因此调用会创建一对端点,一个用于读取,一个用于写入。socketpairpipepipe

当您创建一对套接字时,您希望稍后有一对进程或线程,每个进程或线程都使用对的一端,与使用的完全相同,只是您有一个双向通道。但关键是,无论使用多少进程或线程,在一个端点上写入的内容都会在另一个端点上读取。您可以想象,一个进程在一个套接字上发布请求,并且,如果使用像互斥锁这样的同步工具,许多工作线程在它持有互斥锁的那一刻读取一个要处理的请求pipe