|
藍森林 http://www.lslnet.com 2006年6月6日 10:18
msgsnd()報錯permission denied?
ret=msgsnd(msqid,&wrbuf,wsize,0) 返回值是 -1,報錯信息如題,請問大概有哪些方面的原因? |
msgsnd()報錯permission denied?
你有沒權限訪問那個消息隊列 |
msgsnd()報錯permission denied?
我知道是沒權限,怎麼讓他有呢?不能總是用root執行吧,哪些地方要改的? |
msgsnd()報錯permission denied?
我知道是沒權限,怎麼讓他有呢?不能總是用root執行吧,哪些地方要改的? |
msgsnd()報錯permission denied?
我知道是沒權限,怎麼讓他有呢?不能總是用root執行吧,哪些地方要改的? |
msgsnd()報錯permission denied?
| msgsnd()報錯permission denied?
ret=msgsnd(msqid,&wrbuf,wsize,0)
發送權限一般有如下幾種:
1、msgid創建者與你的進程屬於同意個組,或者屬於親緣關係的進程。但是這個同時受到如下理由的影響。
2、msgid的創建者,指定了它當年創建的隊列的權限信息。這個制約訪問者的許可。如果設置為0700的話,就算是同組,也不能訪問。
3、隊列訪問的數據權限。 |
msgsnd()報錯permission denied?
[code] #include
extern int errno;
void msgstat(int msgid,struct msqid_ds msq_info)
{
int ret;
ret=msgctl(msqid,IPC_STAT,&msq_info);
printf("total number of bytes:%d\n",msq_info.msg_cbytes);
printf("number of messages:%d\n",msq_info.msg_qnum);
}
main()
{
ket_t msgkey;
int msgid;
int wsize,rsize,tsize;
char *parhn="/home/....";
struct msqid_ds msgq_info;
struct w_msgbuf
{int mtypes;
char mtext[1];
}w_msgbuf;
struct r_msgbuf
{int mtype;
char mtext[5];
}r_msgbuf;
struct w_msgbuf wrbuf;
wrbuf.mtype=2;
wrbuf.mtext[0]='k';
wsize=sizeof(wrbuf.wtext);
printf(" write bytes:%d\n",wsize);
msgkey=ftok(pathn,'a');
printf(" key_t=%d\n",msgkey);
printf("errno:%s\n",strerror(errno));
msgid=msgget(msgkey,IPC_CREAT); /*若加上權限0666如後所示*/
printf(" msgid=%d\n",msgid);
printf("errno:%s\n",strerror(errno));
tsize=msgsnd(msgid,&wrbuf,wsize,0);
printf(" actually write bytes=%d\n",tsize); /*輸出:actually write bytes=-1 permission denied.*/
printf("errno:%s\n",strerror(errno));
msgstat(msgid,msgq_info);
}[/code]
如果msgid=msgget(msgkey,IPC_CREAT|00666);
那麼:
msgid=-1
permission denied.
...invalid argument...
不知道斑竹所指的msgid的創建者是不是 msgget? |
msgsnd()報錯permission denied?
void msgstat(int msgid,struct msqid_ds msq_info)
{
int ret;
ret=msgctl(msqid,IPC_STAT,&msq_info);
printf("total number of bytes:%d\n",msq_info.msg_cbytes);
printf("number of messages:%d\n",msq_info.msg_qnum);
}
msqid看來不是全局變量,參數msgid與msqid不一樣,把這個改了再說 |
msgsnd()報錯permission denied?
抱歉我敲錯了。這個函數參數和裡面的變量都是都是「msq」打頭的
(爪誤) |
msgsnd()報錯permission denied?
我幫你測試了一下,沒問題!
環境Hp-11
[code]
#include <stdio.h>;
#include <unistd.h>;
#include <stdlib.h>;
#include <errno.h>;
#include <sys/msg.h>;
#include <sys/ipc.h>;
void msgstat(int msgid,struct msqid_ds msq_info)
{
int ret;
ret=msgctl(msgid,IPC_STAT,&msq_info);
printf("total number of bytes:%d\n",msq_info);
}
main()
{
int msgid;
key_t msgkey;
int wsize,rsize,tsize;
char *pathn="/home";
struct msqid_ds msgq_info;
struct w_msgbuf
{
int mtypes;
char mtext[1];
}w_msgbuf;
struct r_msgbuf
{
int mtype;
char mtext[5];
}r_msgbuf;
struct w_msgbuf wrbuf;
wrbuf.mtypes=2;
wrbuf.mtext[0]='k';
wsize=sizeof(wrbuf.mtext);
printf("write bytes:%d\n",wsize);
if( ( msgkey=ftok(pathn,'a')) < 0 )
printf("errno:%s\n",strerror(errno));
printf(" key_t=%d\n",msgkey);
if(( msgid=msgget(msgkey,IPC_CREAT|0666) ) < 0 )
printf("errno:%s\n",strerror(errno));
tsize=msgsnd(msgid,&wrbuf,wsize,0);
printf(" actually write bytes=%d\n",tsize);
tsize=msgrcv(msgid,&wrbuf,wsize,2,0);
printf(" actually read bytes=%d\n",tsize);
printf(" actually read data=%s\n",wrbuf.mtext);
msgstat(msgid,msgq_info);
}
[/code] |
msgsnd()報錯permission denied?
應該沒什麼問題的,老大,我要回家了,明太在說吧,ok? |
msgsnd()報錯permission denied?
千萬別,您是此地老大 :roll:
我還是再看看man吧。 |
| |