4

以下代码将“A”和“B”都写入文件“out.txt”,第一次调用 open 返回 3,第二次调用返回 4。

我期望将“A”写入文件,将“B”写入屏幕。我还希望 open 在每种情况下都返回 3。

我应该怎么做才能修复以下代码:

int main(int argc, char** argv)
{
    int file = open("out.txt", O_APPEND | O_WRONLY);
    if(file != 3)    return 1;

    if(dup2(file,1) < 0)    return 1;
    std::cout << "A" << std::endl;

    if(dup2(1,file) < 0)    return 1;
    std::cout << "B" << std::endl;

    file = open("out.txt", O_APPEND | O_WRONLY);
    if(file != 3)    return 1;

    return 0;
}
4

1 回答 1

5

从此链接发表评论;

if(dup2(file,1) < 0)    return 1;

使 newfd 成为 oldfd 的副本,必要时先关闭 newfd `

也就是说,它关闭 stdout 并使文件描述符 1 成为文件描述符 3 的克隆。

if(dup2(1,file) < 0)    return 1;

如果 oldfd 是一个有效的文件描述符,并且 newfd 与 oldfd 具有相同的值,则 dup2() 什么都不做,并返回 newfd。

所以它什么也不做,因为文件描述符 1 与文件描述符 3 具有相同的值。

file = open("out.txt", O_APPEND | O_WRONLY);

将使用下一个可用的文件描述符打开一个文件。由于文件描述符 3 很忙,它将(在这种情况下)使用 4。

你想做的是更多类似的事情;

int stdoutCopy = dup(1);                // Clone stdout to a new descriptor
if(dup2(file, 1) < 0) return 1;         // Change stdout to file
close(file);                            // stdout is still valid
std::cout << "A" << std::endl;
if(dup2(stdoutCopy,1) < 0) return 1;    // Change stdout back from the clone
close(stdoutCopy);                      // Close the clone
std::cout << "B" << std::endl;
于 2013-01-24T11:36:06.157 回答