当前位置: 首页 > 面试题库 >

关闭它们后重新打开stdout和stdin文件描述符

毋澄邈
2023-03-14
问题内容

我正在编写一个函数,给定一个参数,该函数将把stdout重定向到文件或从文件中读取stdin。为此,我关闭与stdout或stdin关联的文件描述符,以便在我打开文件时,它在刚关闭的描述符下打开。这行得通,但是问题是,一旦完成,我就需要将stdout和stdin恢复到它们真正应该的样子。

我可以为stdout做的事情是open(“ / dev / tty”,O_WRONLY);
但是我不确定为什么这样做,更重要的是,我不知道stdin的等效语句。

所以我有,为标准

close(1);
if (creat(filePath, O_RDWR) == -1)
{
    exit(1);
}

而对于标准输入

close(0);
if (open(filePath, O_RDONLY) == -1)
{
    exit(1);
}

问题答案:

您应该使用dup()和dup2()来克隆文件描述符。

int stdin_copy = dup(0);
int stdout_copy = dup(1);
close(0);
close(1);

int file1 = open(...);
int file2 = open(...);

< do your work. file1 and file2 must be 0 and 1, because open always returns lowest unused fd >

close(file1);
close(file2);
dup2(stdin_copy, 0);
dup2(stdout_copy, 1);
close(stdin_copy);
close(stdout_copy);

但是,您可能要小心一点细节(来自man dup):

这两个描述符不共享文件描述符标志(close-on-execflag)。重复描述符的执行关闭标志(FD_CLOEXEC;请参阅fcntl(2))关闭。

如果这是一个问题,则可能必须还原close-on-exec标志,可能使用dup3()而不是dup2()以避免竞争情况。

另外,请注意,如果您的程序是多线程的,则其他线程可能会意外地向重新映射的stdin / stdout写入/读取。



 类似资料:
  • 问题内容: 我认为这个问题更多是“编码风格”,而不是技术问题。 说我有一行代码: 文件描述符会自动关闭还是留在内存中?如果文件描述符未关闭,则首选的关闭方式是什么? 问题答案: 如果将文件对象分配给变量,则可以使用来显式关闭它 另外,(也通常是首选),您可以使用Python文档中提到的关键字(Python 2.5及更高版本): 在处理文件对象时,最好使用关键字。这样做的好处 是 ,即使在执行过程中

  • 问题内容: 我有一个多线程控制台应用程序,它从两个不同的来源获取输入。一种是用户在控制台中键入内容,另一种是网络。我使用BufferedReader.readline()从用户那里获取输入,并且该输入被阻止,这很好,除非在等待时收到网络输入。在那种情况下,我需要通过取消readline()来解除对用户线程的阻塞。 我想最好的取消方法是关闭System.in并使readline()抛出异常。在那之后

  • 问题内容: 我试图在Python中使用子进程,以使外部脚本以类似于服务器的方式打开。外部脚本首先加载模型。完成此操作后,它将通过STDIN接受请求,并将处理后的字符串返回给STDOUT。 到目前为止,我已经尝试过 但是,我不能使用 为了通过子过程重复处理input_strings,无论我使用还是,out都将是空的。但是,当我在读取STDOUT之前关闭stdin时,它起作用了,但是这关闭了子进程,这

  • 问题内容: 假设操作系统是linux。假设我打开了一个文件进行写入并获取了一个文件描述符。是否有可能获得另一个文件描述符,对文件进行只读访问而无需再次调用?我不想调用的原因是底层文件可能已被其他进程移入文件系统或什至在文件系统中未链接,因此重用相同的文件名对此类操作是不可靠的。所以我的问题是:如果仅给出文件描述符,是否仍然可以用不同的访问权限打开文件描述符? 我想还是不会更改访问权限。 问题答案:

  • 问题内容: 我可以轻松进行“作业”,但是我发现输入流的关闭存在一些问题。简单地说,我必须使用Java创建一个联系人“列表”应用程序,才能以正确的方式使用多态。所以我有一个Contact类和一个Private类(contact)。在这两个类中,都有一个Modify方法来更改变量的值。 这是不会产生问题的Contact方法 相反,这是Private中方法的替代。首先,我创建一个Private对象,然后

  • 关闭Android Studio选项卡后,我无法再次打开它。在卸载并重新安装软件之前,我无法打开Android Studio。每隔一段时间,屏幕就会变灰,我不得不重新安装。 我尝试过右键单击并选择“打开”,但它没有任何作用。 我原以为Android Studio会在点击后打开,但似乎我从来没有安装过它。它只在我关闭选项卡之前有效。 更新: 我进入我的文件,点击了一个叫做“工作室”的。它给了我一个名