3

プログラムでは、すべてのprintfsをsyslogに書き込む必要があります。すべてのprintfをsyslogに置き換えるので、stdoutとstderrをsyslogにリダイレクトすることを考えました。そのために私は次のコードを試しました

int main()
{
    FILE *fl;
    fl = popen("logger","w");
    if(fl == NULL)
        return 1;
    fprintf(fl,"logger test new");//this goes to /var/log/messages
    int nf;
    nf = fileno(fl);
    dup2(nf,STDOUT_FILENO);
    dup2(nf,STDERR_FILENO);
    fprintf(stdout,"Wriiten in stdout\n");
    fprintf(stderr,"Wriiten in stderr\n");
    pclose(fl);
}

問題は、stderrがsyslogに移動し、画面に何も出力されず、プログラムがハングすることです。提案してください。

4

2 に答える 2

4
dup2(nf,STDOUT_FILENO);
dup2(nf,STDERR_FILENO);
fprintf(stdout,"Wriiten in stdout\n");
fprintf(stderr,"Wriiten in stderr\n");
fflush(stdout);

これで解決するはずです。

fflush()バッファリングされたデータが stdout から強制的に書き込まれます。

于 2013-01-24T16:12:24.590 に答える