0

以下のコードを実行していますが、ファイルにリダイレクトできません。ファイルは作成されますが、何も入れられません。最後のdup2(saveout,1)ステートメントを削除すると、ファイルを作成して書き込むことはできますが、ターミナルに戻ることができません。これは重要です。コードに戻すとすぐにdup2(saveout,1)リダイレクトは機能しなくなりますが、ターミナルに戻ることができます。なぜこれが起こっているのか分かりません。リダイレクトしてターミナルに戻りたいのですが。

main.cpp

#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string>
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
using namespace std;

void printmessage() {
    printf("this is the message\n");
}

int main(int argc, char** argv) {    
    int saveout;
    int fd;
    saveout = dup(1);

    for (int i = 0; i < 10; i++) {
        fd = creat("/home/carl/example.txt",O_CREAT|O_APPEND);
        dup2(fd, 1);
        close(fd);
        printf("Testing the message");
        printmessage();

       dup2(saveout,1);
       close(saveout);
    }
    return 0;
}
4

3 に答える 3

2

これはファイルの権利の問題です。使用している関数のマニュアルページを読む必要があります。

creat() takes as first argument the filename, and as second the file creation rights, not its opening mode.

creat()関数は、いくつかの特定のフラグを使用した単純なopen()呼び出しであるため、権限を設定するだけで済みます。

ファイルを開き、ファイルが存在しない場合は作成する場合は、次を使用します。

open(filename, O_CREAT | O_RDWR | O_APPEND, 0600) for example, or
creat(filename, 0600),

これはほとんど同等ですが、「creat()はopen()と同等であり、フラグはO_CREAT | O_WRONLY | O_TRUNCに等しい」ため、テキストを追加することはできません。

于 2013-02-22T18:33:30.413 に答える
0

printfデフォルトでバッファリングされます。(ttyへの出力の場合は行ごとに、他の何かへの出力の場合はおそらく異なります)。の両方を呼び出す前にdup2(..., 1)、次のようにフラッシュする必要がありますfflush

fflush(stdout);
于 2013-02-22T18:27:52.227 に答える
0

を閉じたため、2番目dup2(saveout,1);は失敗しますsaveout

于 2013-02-22T22:16:03.733 に答える