- 论坛徽章:
- 0
|
在fedora7.0平台上写一个消息队列的代码,有一个奇怪的问题请教:
如果用msgget(key, IPC_CREAT | 0600)来创建消息队列,在colinux上的fedora7.0可以正常运行,但是在vmware上的fedora7.0却提示“Permission denied”,如下:
[lb@lb server]$ ./server
msgget:create: Permission denied
还是在vmware上的fedora7.0,如果用msgget(key, IPC_CREAT | 0000)来创建消息队列,那么,msgget似乎可以了,可是在msgrcv的时候又出错了,也是“Permission denied”,如下:
[lb@lb server]$ ./server
msgrcv err!: Permission denied
想知道这是什么原因?msgget的0600这个值是怎么取得的?
另外,我用umask查看了两个环境的值,都是0002,这应该不会是原因吧?
_____________________代码_________________________________________________
#include <sys/types.h> ///////////////////////////
#include <sys/ipc.h> //// msgget(), msgrcv() ///
#include <sys/msg.h> ///////////////////////////
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 512
/* Message structure */
struct msg {
long msg_type;
char msg_text[BUFSZ];
};
int main(void)
{
int qid; /* The queue identifier */
key_t key; /* The queue key */
key = 125;
struct msg pmsg; /* A message structure */
int len; /* Length of message */
/* Create the queue */
//if((qid = msgget(key, IPC_CREAT | 0666)) < 0)
if((qid = msgget(key, IPC_CREAT | 0600)) < 0)
{
perror("msgget:create");
exit(EXIT_FAILURE);
}
//printf("created queue id = %d\n", qid);
/* Open the queue again */
if((qid == msgget(key, 0)) < 0)
{
perror("msgget:open");
exit(EXIT_FAILURE);
}
//printf("opened queue id = %d\n", qid);
/* Retrieve and display a message from the queue */
len = msgrcv(qid, &pmsg, BUFSZ, 0, 0);
if(len > 0)
{
(&pmsg)->msg_text[len] = '\0';
printf("reading queue id: %05d\n", qid);
printf("message type: %05ld\n", (&pmsg)->msg_type);
printf("message length: %d bytes\n", len);
printf("message text: %s\n", (&pmsg)->msg_text);
}
else
{
perror("msgrcv err!");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} |
|