4

次のコードは、ファイル「out.txt」に「A」と「B」の両方を書き込んでおり、openの最初の呼び出しは3を返し、2番目の呼び出しは4を返します。

私が期待したのは、「A」がファイルに書き込まれ、「B」が画面に書き込まれることです。また、いずれの場合もオープンで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 に答える