【问题标题】:accept() returns same socket descriptor numbers [duplicate]accept() 返回相同的套接字描述符编号 [重复]
【发布时间】:2013-12-06 10:56:11
【问题描述】:

作为accept() 新客户端套接字的参数, 侦听器套接字位于共享内存区域中,并由所有分叉的服务器进程共享。

但是每个服务器 processesaccept()returns the same socket descriptor afteraccept()` 被所有不同的分叉进程调用。

fork() 是否也为套接字描述符和每个分叉进程创建单独的区域 单独管理区域? 这就是他们产生重复套接字描述符的原因吗?

我打算使用select() 来检测所有套接字描述符的变化, 但是因为它们产生所有相同的描述符,所以我无法理解..

【问题讨论】:

  • 这个设置听起来很奇怪,你是从多个服务器上调用accept()fork()ed?诶?通常,您有一个服务器在套接字上调用accept(),而fork() 有一个单独的进程来处理客户端套接字...
  • @MeNa:链接的问题是指线程而不是进程。
  • @alk 你说得对...这是关于进程的:stackoverflow.com/questions/5915144/…
  • 监听套接字是共享的,因为它是您分叉时打开的文件描述符,而不是因为您正在使用共享内存(这不是必需的)。每个已建立的新连接仅存在于一个进程中,不能从其他进程访问(在accept 之前分叉)

标签: c linux sockets process fork


【解决方案1】:

是的,套接字描述符(以及文件描述符)的值是在每个进程的基础上管理的。

【讨论】:

  • 那么所有文件描述符也由每个进程库管理?那么共享文件描述符就是fork之前创建的文件描述符?
  • 只是为了完整性...继承 fork 并不是与另一个进程共享文件描述符的唯一方式。还有文件描述符传递。参见例如stackoverflow.com/questions/2358684/…
  • 呜呜呜!如果我能早一点看到你的答案,那对我正在做的工作会有很大的改变。无论如何,真的非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多