如何修复在C中使用msgrcv时权限被拒绝的错误

enyaitl3  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(146)

我想做一个程序在C接收消息队列中的消息。我有现有的代码在这里:

typedef struct {
    long id;
    char mes[20];
} message;

int main() {
    
    key_t cle = ftok(".",0);
    
    if(cle == -1){
        perror("ftok");
        return -1;
    }
    
    int msqId = msgget(cle, IPC_CREAT | IPC_EXCL ) ;
    if (msqId == -1) {
        msqId = msgget(cle, IPC_EXCL);
        if (msqId == -1) {
            perror("msgget");
            return -1;
        }
    }

    message mes;

    while (1) {
        int received = msgrcv(msqId, &mes, sizeof(message)-sizeof(long), 0, 0);
        
        if(received == -1){
            perror("msgrcv");
            return -1;
        }
        
        printf ("Server: message received.\n");
    }

    return 0;
}

它给出了以下错误:msgrcv:权限被拒绝
我还尝试使用以下命令更改 ftok 的路径:“/tmp”、“/etc/密码”

yws3nbqq

yws3nbqq1#

int msqId = msgget(cle, IPC_CREAT | IPC_EXCL ) ;

msgget的参数决定了创建它时所使用的权限。这是一个模式编号,可以用八进制指定,例如0600,以向当前用户给予读写权限。或者,常量S_IRWXU(等于0700)也可以用于执行相同的操作:

int msqId = msgget(cle, IPC_CREAT | IPC_EXCL | S_IRWXU ) ;

您可能希望在msgget()调用之后添加调试打印,以了解它是创建了一个新队列(使用您给予的权限),还是找到了一个现有队列(具有创建时指定的权限)。

相关问题