我不明白以下代码有什么问题。 我两次执行完全相同的动作。 它第一次工作,而第二次失败。

  1. 开放FD
  2. 复制到标准输入。
  3. 关闭标准输入
  4. 关闭原始fd

第二次,在阶段4,我得到一个错误,这意味着FD已经关闭。

  int fd =open("/path/to/some/file",0,"r");
  if (dup2(fd,STDIN_FILENO)<0)
    perror("dup_in");
  if (close(STDIN_FILENO)<0)
    perror("close_in");
  if (close(fd)<0)
    perror("close_fd");

  //Up to here it works fine.

  fd =open("/path/to/some/file",0,"r");
  if (dup2(fd,STDIN_FILENO)<0)
    perror("dup_in2");
  if (close(STDIN_FILENO)<0)
    perror("close_in2");
  if (close(fd)<0) //<-- ERROR!
    perror("close_fd2"); //<--close_fd2: Bad file descriptor

#1楼 票数:3 已采纳

按照手册页

int dup2(int oldfd, int newfd);

如果oldfd是有效的文件描述符,并且newfdnewfd具有相同的值,则dup2()不执行任何操作,并返回newfd

因此,在第二种情况下, open()使用的可用FD最少,为0 [最后一次调用close()释放的FD]。 这就是oldFDnewFD变为相同的方式,从而产生错误。

注意:在使用open()返回的fd之前,您应该始终验证open()调用的成功。

  ask by Tzafrir translate from so

未解决问题?本站智能推荐:

2回复

C将标准输出重定向到带有预定义消息的文件

我想使用 dup() 和 dup2() 将 case 's' 复制到 case 'f' 的打开文件中时在 stdout 中打印的消息。 我不确定 dup 系统调用如何工作以及如何将 stdout 复制到文件中。 我知道我必须使用 dup 来捕获 stdout 指向的内容,然后使用 dup2 在屏幕和
3回复

保存/复制文件指针/描述符

我有一个全局 FILE指针/描述符的要求。 其中一个功能将从该指针/描述符读取。 与FILE指针/描述符关联的内部指针前进。 此函数返回后, 我想从与另一个函数读取相同的FILE指针/描述符中读取数据,并从相同的数据中读取数据。 但是我无法读取相同的确切数据,因为内部指针已经改进。
1回复

在C中重定向标准输出时的奇怪行为

我正在尝试将stdout重定向到文件,然后将其恢复为C语言中的原始文件,但是我遇到了以下奇怪的问题-以下代码成功写入 in stdout in stdout 在stdout和各自in file中的文件中都可以。 但是,删除主要功能的第一行: 导致in file in stdou
2回复

复制epoll文件描述符

有没有办法复制使用epoll_create创建的文件描述符,以便可以独立修改副本(使用epoll_ctl添加/删除监视文件描述符)。 例如,我创建一个epoll文件描述符A ,它等待文件P和Q上的事件。 我将其复制到epoll文件描述符B ,并使B也等待文件R上的事件。 调用epoll_
1回复

在c中使用dup和dup2重定向标准输出时出现问题

我的 dup 和 dup2 有问题。 我不明白为什么我的文件 file1 中的数据显示在屏幕上,因为 dr 是标准输入而 dw 是标准输出... 谢谢您的帮助。
2回复

更改文件描述符的读/写权限

我正在研究一个Linux C项目,我在使用文件描述符时遇到了麻烦。 我有一个孤立文件描述符(文件是open()'然后取消链接()'但fd仍然很好)具有只写权限。 原始后备文件具有完全权限(使用S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH创建),但是文件是使用O
1回复

为什么fork()通过dup2()关闭一个文件描述符

我编写代码来理解dup2()。 lsof显示了2个打开的文件描述符(/workspace/source/throw.cpp是传入的参数) 但是,当我fork()它到2个进程(代码如下)时,只打开了一个/workspace/source/throw.cpp。 问题1:是什么导致dup
4回复

如何将system()的输出重定向到文件?

在这个C程序中 我正在尝试将system()的输出重定向到文件,因为我已经使用过dup2,但是它不起作用。 此代码有什么问题 ? 并且,请告诉我是否有更好的方法可以做到这一点 ? (不使用终端上的> )