【问题标题】:How do I prevent socket() system call from returning file descriptor 0,1 or 2?如何防止 socket() 系统调用返回文件描述符 0,1 或 2?
【发布时间】:2017-02-19 06:39:39
【问题描述】:

我正在对 IPC 使用 socketpair() 系统调用,如果其中任何一个可用,它会返回 0,1 或 2 个文件描述符。使用 write() 系统调用 fd 0 写入 STDIN 从而弄乱我的应用程序的输出。有什么办法可以防止 socketpair() 返回 0,1 或 2 作为 fd 吗?

【问题讨论】:

  • 使用 write() 到 FD 0 写入到连接到 0 的任何位置。如果它是一个套接字,它就不是stdin,它不能“弄乱你的应用程序的输出”。尚不清楚您是否有问题需要解决。
  • socketpair的返回值不是文件描述符,它是一个状态码(-1或0),表示失败或成功。
  • 我的错,我的意思是说套接字被分配了文件描述符 0,1 或 2。

标签: c sockets unix-socket


【解决方案1】:

在使用socketpair()之前不要关闭标准输入、标准输出或标准错误。如有必要,为这些文件描述符打开 /dev/null

当分配文件描述符时(通过任何系统调用 - open()socket()socketpair()accept()pipe()dup() 等),使用的数字始终是可用的最低值(未开封)号码。如果你得到socketpair()分配的0、1或2,这意味着你必须关闭相应的描述符——但你为什么要这样做?没关系;不要这样做。

或者通过打开/dev/null来修复它。请记住,0 应该是可读的,而 1 和 2 应该是可写的(如果 0 是可写的,而 1 和 2 是可读的并不重要;事实上,当 shell 在终端中启动时,这三个通常都是可读的 并且可写)。

【讨论】:

  • 你说得对,我从未关闭过 STD*。问题出在其他地方。
猜你喜欢
  • 2021-06-24
  • 2014-05-08
  • 2017-02-12
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2023-04-07
相关资源
最近更新 更多