2012-08-03 122 views
1

仍然無法生成隨機種子。這裏是我的代碼:從/ dev/random讀取隨機數(c)

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

double dev_random_seed(){ 
    double randval; 
    FILE* f; 

    f = fopen("/dev/random", "r"); 
    if(f == NULL){ 
    fprintf(stderr, "WARNING: Failed to open /dev/random. Random seed defaults to 1. \n"); 
    return 1; 
    } 

    fread(&randval, sizeof(double), 1, f); 
    fclose(f); 
    return randval; 
} 

int main(int argc, char** argv){ 
    double arse = dev_random_seed(); 

    printf("errno: %i\n",errno); 
} 

的輸出是:

errno: 22 

這是EINVAL。不能發現錯誤 ,我吮吸c。

+0

只是要一清二楚,你也看到了「警告」消息或者只是errno? – 2012-08-03 15:21:46

+1

只有在發生某些故障時纔會查詢「errno」。我看不到'main()'可以知道如何檢查'errno'? – hmjd 2012-08-03 15:22:22

+0

這是一個最小的工作示例,顯示代碼將errno設置爲22,原因不明。 – Lucas 2012-08-03 15:23:17

回答

1

除非有錯誤,否則不要檢查errno。
這可能是一個庫預先設定了錯誤號的價值,因爲它代表一個原因是後面的部分將不知道,如果後期有錯誤(遺憾的是,可能是更清晰)

https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=6619179

+0

這似乎是發生了什麼事。雖然它不是什麼手冊所說的(但「男人3 fread」不會聲稱)。 – Lucas 2012-08-03 15:36:15

+0

@lucas有時在lib代碼中,您會看到將errno設置爲例如。 「內存不足」,然後嘗試一個alloc,所以如果失敗,你可以退出errno正確設置,如果成功則無關緊要。 – 2012-08-03 15:44:18

+0

是的,我明白爲什麼它完成了。這說得通。只是我在不同的地方看到過「如果有錯誤,fread把errno設置爲22」等多種寫法,我現在看到,這很容易讓人誤解。 – Lucas 2012-08-03 15:51:10

0

如果沒有錯誤,則不應檢查errno。通知主要是一個有錯誤,你可以使用下面的代碼:

if (fread (&randval, sizeof(double), 1, f)<0) return NAN; 

,相應地,在主:

if (isnan (arse)) printf ("Error has occured: %i\n",errno);