我寫一個程序,讀取標準input.i有這樣一個循環:如何停止閱讀「cat/dev/urandom」?
while(read(0, buffer, sizeof(buffer)) > 0)
它工作正常,但是當我做一個貓的/ dev/urandom設備| ./myprogram循環從不停止。所以我想在經過一段時間後停止閱讀。
我寫一個程序,讀取標準input.i有這樣一個循環:如何停止閱讀「cat/dev/urandom」?
while(read(0, buffer, sizeof(buffer)) > 0)
它工作正常,但是當我做一個貓的/ dev/urandom設備| ./myprogram循環從不停止。所以我想在經過一段時間後停止閱讀。
而是執行此操作,以獲得隨機數據的2K到myprogram
:
cat /dev/urandom | head -c 2000 | ./myprogram
其實我想避免這種情況,因爲我只是想防止從非常大的文件中讀取數據。 – user2277536
你可能想設置使用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()
。
我不久前遇到過這樣的問題。你可以使用time
和difftime
,例如像這樣:
time_t t = time(NULL);
double max_seconds = 1.0;
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) {
/* ... */
}
我發現很難停止閱讀魔戒。但是/ dev/urandom,雖然引用不可預測,但對我來說太重複了。 – ugoren