2011-04-04 63 views
1

在打開文件描述符fd和其他/ dev/random的完整性檢查之後,我試圖讀取設備中可讀的字節數,所以如果我的程序需要,可以抽取這個數量。Linux:ioctl/FIONREAD返回0字節/ dev/random?

我的基本代碼是這樣的:

if (fd = open("/dev/random", O_RDONLY) < 0) { 
    perror("open"); 
    return 1; 
} 
... 
if(ioctl(fd, FIONREAD, &n) < 0) { //file descriptor, call, unsigned int 
    perror("ioctl"); 
    return 1; 
} 
printf("%d bytes available for reading.\n", n); 
return 0; 

無論什麼情況下(如認爲需要的情況下,root或普通用戶),它總是返回可供讀取0字節。

我一直在suggested before這是一種方法來檢索我可以從設備中取出什麼,你知道我的程序中有什麼可能的問題或錯誤導致它總是返回零嗎?你知道任何其他方法來做我想做的事嗎?

+0

'/ dev/urandom'是怎麼回事?試試吧 – maverik 2011-04-04 07:20:05

+0

@Maverik,完全一樣,'0' – Alexander 2011-04-04 08:35:03

回答

2

您正在使用哪個Linux版本?在2.6.32程序輸出

IOCTL:無效的參數

FWIW,我已經能夠找到WRT的FIONREAD ioctl的說,這是對插座,管道,FIFO文件和tty的。/dev/random,OTOH是一個字符特殊文件,所以加上「無效參數」errno,我會說FIONREAD不支持/ dev/random。

不,我不知道任何簡單的內置方法來找出/ dev/random中可用字節的數量。有一件事可能會起作用,就是讓一個單獨的線程從/ dev/random中讀取數據並將其放入一個線程安全的隊列中,然後有一種方法來檢查隊列是否爲非阻塞方式(例如,構建圍繞pthread_mutex_trylock())。

+0

我是'2.6.35',它工作正常。這很奇怪,因爲我做了一個statbuf並執行'if(S_ISCHR(mode)|| S_ISFIFO(mode)|| S_ISSOCK(mode))'以防萬一,以防它和FIONREAD一起工作。我想我會尋找一個不太具體的解決方案,Erg謝謝。編輯:IS_CHR很奇怪,但寫這個例子的人擁有它。 – Alexander 2011-04-04 08:33:55

+0

好吧,S_ISCHR會評估爲true,因爲正如我所提到的,/ dev/random是一個字符特殊文件。然而,字符特殊文件不是套接字,管道,FIFO,也不是TTY,正如我懷疑的那樣,它是FIONREAD支持的(注意:tty是字符特殊文件,但反過來不一定是真的,因此isatty()函數)。 – janneb 2011-04-04 08:40:47

+0

謝謝你清除這些東西,我必須基本上自己找出這些東西,沒有那麼適合你的蛋糕。也許我應該看看OpenSSL源代碼,看看他們是否有東西可以打開它(可能會使用/ dev/random來幫助熵) – Alexander 2011-04-04 13:50:44