2013-04-14 31 views
0

我寫一個程序,讀取標準input.i有這樣一個循環:如何停止閱讀「cat/dev/urandom」?

while(read(0, buffer, sizeof(buffer)) > 0) 

它工作正常,但是當我做一個貓的/ dev/urandom設備| ./myprogram循環從不停止。所以我想在經過一段時間後停止閱讀。

+1

我發現很難停止閱讀魔戒。但是/ dev/urandom,雖然引用不可預測,但對我來說太重複了。 – ugoren

回答

1

而是執行此操作,以獲得隨機數據的2K到myprogram

cat /dev/urandom | head -c 2000 | ./myprogram 
+0

其實我想避免這種情況,因爲我只是想防止從非常大的文件中讀取數據。 – user2277536

1

你可能想設置使用alarm()報警。

alarm(1); 

{ 
    size_t ssizeReadTotal = 0; 

    { 
    ssize_t ssizeRead = 0; 

    while (0 < (ssizeRead = read(0, buffer + sizeReadTotal, sizeof(buffer) - sizeReadTotal))) 
    { 
     sizeReadTotal += ssizeRead; 
    } 

    if (0 > ssizeRead) 
    { 
     if (EINTR == errno)) 
     { 
     fprintf(stderr, "Filling the buffer was interrupted by alarm clock.\n"); 

     } 
     else /* some *real* error occurred */ 
     { 
     perror("read()"); 
     } 
    } 
    } 

    if (sizeof(buffer) > sizeReadTotal) 
    { 
    fprintf(stderr, "The buffer was not fully initialised!\n"); 
    } 
} 

這個信號在012秒之後發出SIGALRM。信號中斷呼叫read()。它將返回-1並將errno設置爲EINTR

當緩衝區填滿時,也會停止read()

0

我不久前遇到過這樣的問題。你可以使用timedifftime,例如像這樣:

time_t t = time(NULL); 
double max_seconds = 1.0; 
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) { 
    /* ... */ 
}