【问题标题】:What's the easiest workaround on the OS, which doesn't have the dup2 syscall?没有 dup2 系统调用的操作系统上最简单的解决方法是什么?
【发布时间】:2021-11-15 23:38:14
【问题描述】:

我正在使用 xv6 操作系统,我需要用一个文件替换 stdio。这通常是通过dup2 系统调用完成的,这个操作系统没有。有什么解决方法吗?我是否必须实现自己的系统调用来尝试模仿 POSIX 的一种行为?或者我需要的功能(替换文件描述符)可以在 c 程序的常规函数​​中实现吗?谢谢。

【问题讨论】:

  • 看起来它有dup() 调用。哪个可以用来做同样的事情。
  • 因为有dup,所以使用fds。在那个系统上,打开一个新的 fd 是否使用最低可用的?如果是这样,并且当您说 stdio 时,如果您的意思是 fd 0、1 或 2,请在使用 dup 之前关闭您要替换的那个
  • 如果你之前关闭了stdin,那么它的描述符将被分配给dup-ed ——因为它将是可用的最低的。
  • @ikegami 谢谢你的帮助!

标签: c unix posix system-calls xv6


【解决方案1】:
dup2( filedes, filedes2 ); 

意思

close( filedes2 );
fcntl( filedes, F_DUPFD, filedes2 );

你可以的

close(0);
dup(fd);

受限于竞争条件,因为 dup2 原子函数但 close 和 dup 包含两个函数调用。

【讨论】:

  • 由于多线程程序中的竞争条件,检查dupfcntl(fd, F_DUPFD, filedes2) 的返回是否是您期望的文件描述符是明智的。
猜你喜欢
  • 2010-09-20
  • 2022-08-06
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多