2013-01-24 51 views
3

在程序中,我希望所有的printfs被寫入syslog。我將所有printf替換爲syslog,因此我想將stdout和stderr重定向到syslog。對於我嘗試下面的代碼將stdout&stderr重定向到系統日誌

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); 
} 

問題是標準錯誤去syslog並沒有打印在屏幕上的程序被掛起。 請建議。

+0

您僅限於C或你會願意在一個解決方案中使用C++? – Crog

+0

您需要在'pclose()' – Petesh

+1

...之前關閉'stdout'和'stderr' ...理由:'stderr'可以工作,因爲它沒有緩衝。 'stdout'被緩衝並關閉它來刷新緩衝區。 –

回答

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

這應該解決它。

fflush()將強制從標準輸出寫入緩衝數據。

2

fflush(stdout)另一種可能是使用禁用標準輸出緩衝:

setbuf (stdout,NULL); 
相關問題