我正在编写一个函数,给定一个参数,它要么将stdout重定向到一个文件,要么从一个文件读取stdin。为此,我关闭与stdout或stdin关联的文件描述符,这样当我打开文件时,它会在我刚刚关闭的描述符下打开。这是可行的,但问题是一旦这样做了,我需要将stdout和stdin恢复到它们真正应该的状态
我可以为stdout做的是打开的(“/dev/tty”,O_WRONLY);但我不知道为什么会这样,更重要的是,我不知道stdin有一个等价的语句
所以,我有,对stdout来说
关闭(1);
if(创建(文件路径,O_RDWR)=-1)
{
出口(1);
}
至于stdin呢
关闭(0);
如果(打开(文件路径,仅限Ordu)=-1)
{
出口(1);
}
应该使用dup()和dup2()克隆文件描述符
int stdin\u copy=dup(0);
int stdout_copy=dup(1);
关闭(0);
关闭(1);
int file1=打开(…);
int file2=打开(…);
<;做好你的工作。file1和file2必须是0和1,因为open总是返回最低的未使用fd>;
关闭(文件1);
关闭(文件2);
dup2(标准副本,0);
dup2(标准副本1);
关闭(标准副本);
关闭(标准输出拷贝);
但是,有一个小细节您可能需要小心(来自man dup):
这两个描述符不共享文件描述符标志(
在execflag上关闭)。关闭执行标志(FD_CLOEXEC;参见fcntl(2))
对于重复描述符,禁用
如果这是一个问题,您可能必须恢复close on exec标志,可能需要使用dup3()而不是dup2()来避免争用情况
另外,请注意,如果您的程序是多线程的,其他线程可能会意外地写入/读取重新映射的stdin/stdout