2015-08-31 52 views
0

我有一個簡單的程序(使用線程),稱爲./mpace,它在線程函數中使用printf()。當我從終端運行它,輸出被打印的,因爲它應該,但是當I型:未能將linux程序的輸出存儲到文件

**./mpace > text** 

創建的文件是空的。 有趣的是,昨天它完美運作。我鍵入:

echo "test" > text 

檢查是否存在此功能的嚴重問題,但它的工作。 那麼,什麼可能是我的程序意外地開始無法寫入文件的原因?

請注意我不想使用fprintf()從我的代碼,因爲時間消耗是必不可少的。


非常感謝,通過使用fflush(stdout)簡單地解決了該問題。我想在一個新行打印將沖洗通道,但作爲paxdiablo在註釋說明這裏不是:

Why does printf not flush after the call unless a newline is in the format string?

你是正確的,應該提供儘可能多的,因爲他可以信息,但我認爲爲單個printf()共享100行代碼會讓你閱讀起來更困難。我看到這是一個糟糕的決定,因爲沒有使用fflush,並且程序被一個信號終止的事實既導致了問題,也應該被公開。

+2

共享代碼的相關部分將允許其他人回答您... – eyalm

回答

1

可能是一個緩衝問題。 stdout僅在行進到字符設備時才被緩存。要檢查是否有問題,請在撥打printf之後手動撥打fflush(stdout)。確保在程序終止之前,輸出緩衝區stdout已正確刷新。

+2

除非進程被信號終止或調用'_exit()',否則緩衝區將保證被刷新。 – EOF

+0

@EOF在ISO 9899:2011中,該函數被稱爲'_Exit()'。 '_exit()'是來自'unistd.h'的POSIX函數,其定義與'_Exit()'行爲相同。 – fuz

1

那麼它可能是因爲你使用的>>,可能以某種方式代碼>代替(其中的方式,你沒有分享)包含一個換行符(空),然後刪除舊的。讓我給你看一個例子。

讓我們說我們有一個名爲FILE1.TXT下列文件,其中包含以下信息:

Michael 
Jimmy 
Dolores 

而且我不會提取名吉米和輸出重定向到另一個名爲文件FILE2.TXT

cat file1.txt | grep "Jimmy" > file2.txt 

現在的文件2。TXT包含:

吉米

現在讓我們來運行這個命令的3-4倍,並再次檢查該文件:

cat file2.txt 

輸出:

吉米

這是爲什麼?它應該是:

Jimmy 
Jimmy 
Jimmy 
Jimmy 

好becouse我用>,而不是>>。現在讓我們再試一次:

[email protected]:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
[email protected]:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
[email protected]:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
[email protected]:~$ cat file1.txt | grep "Jimmy" >> file2.txt 

輸出:

Jimmy 
Jimmy 
Jimmy 
Jimmy 
Jimmy 

這可能是原因之一。

編輯: 我帶着另一個簡單的例子,讓我們修改吉米與鄧肯:

Michael 
Timmy 
Dolores 

記住FILE2.TXT看起來是這樣的:

Jimmy 
Jimmy 
Jimmy 
Jimmy 
Jimmy 

現在如果你運行:

cat file1.txt | grep "Jimmy" > file2.txt 

我剛剛與我自己因爲>,而不是>>一個空文件,存在FILE1.TXT沒有吉米。

相關問題