2013-10-22 22 views
0

我有一個簡單的C代碼片段如下:使用回滾()與POPEN()

#include <stdio.h> 
void main() { 
    FILE *f; 
    char c; 
    f = popen("ls", "r"); 
    while ((c = fgetc(f)) != EOF) { 
    //Some tasks 
    } 
    rewind(f); 
    while ((c = fgetc(f)) != EOF) { 
    printf("%c", c); 
    } 
    fclose(f); 
} 

我不知道爲什麼代碼輸出什麼。看來rewind()函數不起作用。請幫助找出我錯在哪裏。謝謝。

+0

您正在閱讀程序的輸出。僅僅因爲你可以'回滾()'文件句柄並不意味着'ls'會知道你倒過來並且應該重新啓動它的列表。 –

回答

8

rewind相當於fseek(stream, 0L, SEEK_SET)fseek只對文件,而不是流(這是管道的情況下)是合法的。

檢查errnorewind後應該

EBADF指定的流不是可搜索的數據流。

+0

'ESPIPE'我希望。我以前從未注意到'rewind'返回void。這似乎是一個設計錯誤。 –

+0

我們不能在管道上尋找?爲什麼這樣?在這種情況下有什麼方法可以回放視頻流嗎? – Phieu

+0

@Phieu你不能在管道上尋找,因爲管道只是一個小的內核內存緩衝區,在寫入器生成和讀取器消耗的時間之間暫時保存數據。讀完之後,作者和內核不再擁有它。你有它,如果你想以後得到它,你必須找到一個地方來保存它。重新綁定管道,套接字或串行端口是爲了及時回溯,而unix不會違反因果關係。 –