【问题标题】:Pass new socket fd after fork在 fork 之后传递新的套接字 fd
【发布时间】:2021-09-15 06:06:05
【问题描述】:

是否可以使用 C 将新接受的套接字从父进程传递到子进程?

正确的做法是什么?

我知道parent和child共享同一个open fd,但是fork之后还有新的fd呢?

通过 Unix 域套接字发送文件描述符是唯一的方法吗?是否可以改用 shmget 共享内存以及如何使用?

我已经尝试过 Unix 域套接字,但有时它会因 Mac 中的“错误文件描述符”而失败。

希望有人能帮助我

【问题讨论】:

  • "但有时它会在 Mac 中出现“错误的文件描述符”而失败。”

标签: c sockets


【解决方案1】:

许多常用的多进程服务器根本不使用套接字传递。分叉服务器仅在接受完成后才会分叉子节点,从而继承子节点。预分叉服务器的典型设置将改为继承侦听器套接字,每个子进程将自己调用 accept 并处理返回的子进程。

不过,如果文件描述符应该比 SCM_RIGHTS 传递,则需要使用某种 unix 域套接字。简单的内存共享是不够的,因为套接字文件描述符实际上必须与操作系统内核中的进程相关联。

我已经尝试过 Unix 域套接字,但有时它会在 Mac 中出现“错误文件描述符”而失败。

如果遇到错误,最好找出错误原因,而不是简单地寻找替代方法。即使存在替代机制,它也可能只是显示相同的问题,因为问题可能根本不依赖于特定机制。

【讨论】:

  • 您好,非常感谢您帮助我!你的话给了我动力,让我清楚地知道别人是怎么做的。经过几天的调试,它确实是我错误使用造成的错误。
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多