藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 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吧。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com