【问题标题】:Error safeguarding the input and output file descriptors保护输入和输出文件描述符时出错
【发布时间】:2013-12-14 16:34:21
【问题描述】:

好的,我正在做一个管道来连接我的进程的子进程。 首先,我试图保护我的 fd,以便以后可以访问它们以获取一些东西,但不知何故,它只是在复制 fd 时卡住了。

int pipeFd [2];
int pid;
pipe (pipeFd);

//Safeguard of the Original FDs
int fdSG [2];
perror ("fdsg create");
dup2 (1, fdSG [1]);
perror ("dup2 sfg1");
dup2 (0, fdSG [0]);
perror ("dup2 sfg2");
dup2 (pipeFd [1], 1);

程序卡在此处显示的最后一条指令中。

终端输出如下:

fdsg create: Success
dup2 sfg1: Bad file descriptor
dup2 sfg2: Bad file descriptor
dup2: Bad file descriptor

你们中有人知道为什么会发生这种情况吗?

【问题讨论】:

  • 您的代码似乎没问题。我建议做一个 strace。
  • 如果实际上没有错误,调用perror 是不正确的。 (你应该检查返回值)
  • 我打电话给perror 来检查每一行是否有错误,这是一种调试尝试以了解发生了什么。我不会让它这样的。无论如何感谢您的建议。
  • perror 不会检查是否有错误,它会告诉您errno 是什么。如果您想检查错误,您需要查看 dup2pipe 实际返回的内容。
  • errnoperror 使用的。函数本身返回一个int,表示您是否需要查看errno/perror

标签: c++ unix pipe file-descriptor


【解决方案1】:

根据您显示的代码,您尚未初始化 fdSG。这不正确,dup2 的参数都需要是有效的文件描述符。

由于您似乎想要复制 fd 而不是替换现有的 fd,您应该使用 dup 来代替这些备份副本,它会选择一个免费的 fd 并使用它。 (或者,您也可以将 fdSG 初始化为有效的 fd)。

来自手册页:

dup() 使用编号最小的未使用描述符作为新描述符。

【讨论】:

  • 谢谢,看来它奏效了,因为我没有注意那个细节,所以我很笨。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2020-05-05
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多