2015-04-01 48 views
1

我試着在POSIX創建message_queue與C. 至於我可以告訴時收到錯誤號22,可通過比較示例代碼在網絡上,我已經正確設置了參數。爲什麼設置errno爲22:mq_open()POSIX

這裏是一個片段:

int open_flags; 
    mqd_t mqfd; 
    int bytes_per_msg; 
    struct mq_attr attr; 
    unsigned int* msgbuff; 

    printf("from 1 to 400, what is N? : "); 
    scanf("%d", &n); 
    bytes_per_msg = (n + 1) * (sizeof(unsigned int)); 
    msgbuff = (unsigned int*)malloc(bytes_per_msg); 

    open_flags = O_CREAT|O_RDWR; 
    attr.mq_maxmsg = n; 
    attr.mq_msgsize = bytes_per_msg; 
    attr.mq_flags = 0; 


    mqfd = mq_open("/myqueue", open_flags, 0666, &attr); 

    if(mqfd == -1){ 
     printf("queue creation failed, ERRNO: %d\n",errno); 
    } 

編輯:我不爲更加清晰的歉意。 Errno 22是無效的。 故障代碼的含義--The可以在errno.h中

+2

檢查errno用'perror()'指的是什麼。 – teppic 2015-04-01 04:00:04

+1

errno的整數值是無用的!由errno索引的消息是無價的。人們是如何意識到errno的存在並且不知道「perror」和「strerror」? (這是一個嚴重的問題;你從哪裏學到了errno,並沒有學到使它有用的兩個函數?) – 2015-04-01 04:07:43

+0

你可以查看errno在errno.h上的含義。 使用perror導致相同的結論:錯誤22:無效的參數> 我試圖找出什麼是我的論點無效。 我不記得我在哪找到了errno而沒有錯@WilliamPursell – Chris 2015-04-01 04:45:06

回答

3

我假設你正在使用mq_open(3)在Linux和errno越來越EINVAL被發現。根據文檔,它可能發生時:

名稱不符合mq_overview(7)中的格式。

O_CREAT在oflag中指定,和attR不是NULL,但 attr-> mq_maxmsg或attr-> mq_msqsize無效。這兩個 這些字段必須大於零。在非特權(不具有CAP_SYS_RESOURCE功能)的 進程中, attr-> mq_maxmsg必須小於或等於msg_max 限制,並且attr-> mq_msgsize必須小於或等於 msgsize_max限制。另外,即使在特權進程中, attr-> mq_maxmsg也不能超過HARD_MAX限制。 (見這些限制的細節 mq_overview(7)。)

所以,你也應該閱讀mq_overview(7)

BTW,RTFM總是快於要求在一些論壇喜歡這裏。所以你失去了你和我們的時間。

下次在錯誤情況下使用perror(3)。請注意,POSIX errno.h規範不會將數值分配給像EINVAL這樣的錯誤編號(這是故意的,幾個符合POSIX的系統可能有不同的編號)。

BTW,您應經常檢查的scanf(3)的返回值,你的情況:

printf("from 1 to 400, what is N? : \n"); 
n= 0; 
if (scanf("%d", &n)<1 || n<=0 || n>400) { 
    fprintf(stderr, "bad number (n=%d)\n", n); 
    exit(EXIT_FAILURE); 
} 
+0

感謝您的回答。什麼是RTFM? – Chris 2015-04-01 17:43:17

+1

@Chris:你真的讓我感覺老了......(我通過閱讀SunOS3.2手冊頁學習了Unix編程 - 從第1節到第8節的論文)你不能STFW嗎?我添加了一個關於'RTFM'的鏈接,但是STFW(像GIYF)留給了讀者一個練習。 – 2015-04-01 18:09:11

1

以及對我來說這是一個缺少斜槓「/」的名字引起錯誤號22

相關問題