- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在两个进程之间发送消息。但当我尝试使用 msgsnd()
EACCES
错误
创建消息队列
const char* MSG_QUEUE = "/tmp/msg_queue";
int file = open(MSG_QUEUE, O_CREAT | O_RDWR | O_APPEND, 0755);
close(file);
key_t key = ftok(MSG_QUEUE, 1);
errno = 0;
msg_queue = msgget(key, IPC_CREAT);
if(msg_queue == -1) {
M_DEBUG("Error %s\r\n", strerror(errno));
}
消息结构
struct feld_msg_s {
long id;
char mtext[5];
};
发送消息
struct feld_msg_s a_msg = {1, "Test"};
errno = 0;
int ret = msgsnd(msg_queue, &a_msg, sizeof(a_msg.mtext), 0);
if(ret == -1) {
if(errno == EACCES) {
printf("\r\n NO PERMISSION\r\n");
} else {
printf("msgsnd ERROR!: %s\r\n", strerror(errno));
}
}
在msgsnd的联机帮助页中这样写
EACCES The calling process does not have read permission on the message queue, and does not have the CAP_IPC_OWNER capability.
因此我使用 setcap
命令添加了以下功能
sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP
我已使用 getcap
检查应用程序是否具有这些功能。没关系。但我仍然收到无权限错误。
当以 root 权限执行应用程序时,它可以工作!
有一件事很奇怪,尽管 msgget 成功,但 ipcs
不显示任何消息队列。
那我的错在哪里呢?
我正在使用 Linux Mint
其他问题:是否可以在 msg 结构中使用除 char 以外的其他数据类型,或者消息是否仅限于字符串?
最佳答案
您需要阅读手册页。每the POSIX msgget()
standard :
SYNOPSIS
#include <sys/msg.h>
int msgget(key_t key, int msgflg); [Option End]DESCRIPTION
...
- The low-order 9 bits of msg_perm.mode shall be set to the low-order 9 bits of msgflg.
因此,这段代码
msg_queue = msgget(key, IPC_CREAT);
“msgflg 的低 9 位”全部设置为零。因此消息队列模式也是全0
- 任何人都没有权限。
关于c - msgsnd 无权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573384/
我正在维护一些现有代码 我看到了这个片段: msgsnd( $mQueue, pack("l! a*", length($msg), $msg), 0)
我想在两个进程之间发送消息。但当我尝试使用 msgsnd() 发送消息时,出现 EACCES 错误 创建消息队列 const char* MSG_QUEUE = "/tmp/msg_queue"; i
使用以下代码: #define MSGLEN 128 typedef struct { long id; char message[MSGLEN]; } data; data msg; msgsnd(
[虽然我在 perl 工作,但我相信这个问题与 Linux System V IPC 有关API 和限制,而不是任何特定于 perl 的内容。] 我有两台 Centos 机器,每台机器都是 CentO
从信号处理程序调用 msgsnd 函数安全吗? 我们服务的代码并不打算每次都优雅地完成,所以我没有退出点,但是我需要在服务停止时向另一个进程发送消息,所以我需要捕获 SIGTERM 并执行 msgsn
当使用 msgsnd 时,手册页中提到的结构是 struct mymsg { long mtype; /* message type */ char mtext[1]; /
我有两个不同的程序: 第一个,基本上是无限循环地在消息队列上调用 msgrcv 并在它收到任何东西时打印,在 C++ 中: //foo1.cpp #include #include #includ
该进程创建了 n 个子进程(n 从标准输入读取),每个子进程必须每 2 秒向父进程发送一条消息,然后父进程将收到的每条消息发送给所有子进程。我正在使用 2 个消息队列:一个是所有子级向父级发送消息,另
如果两个线程“同时”调用 msgsnd() 函数,将消息发布到同一个消息队列,会发生什么情况? 如果两个进程做同样的事情怎么办?它们是线程还是进程重要吗? 特别关注 Linux 2.6.15-2.5
我正在尝试使用 pthreads 在 C 中实现一个多线程程序并想在线程之间发送消息。 在网上阅读时,我遇到了两种方法。 一种是 posix Queues,它使用诸如 mq_receive 之类的函数
我正在为考试学习操作系统基础知识,但遇到了一个奇怪的问题。我目前正在研究发送/接收功能。假设我有 3 个主程序 Client,它们通过 msgsnd() 原语发送消息。结构如下: typedef st
我正在编写一个使用 unix 消息队列的程序。问题是这样的,程序报告我“错误:22:无效参数”。我已经 brpwsed,但它不能满足我的搜索。这是简单的代码: bool msg::send(i
我有一个小的 C++ 程序,其中主进程正在“创建数据”并将它们发送到应该读取该数据的子(fork)进程。我的问题是,在学校我的代码运行良好,但在我自己的笔记本电脑上,两个进程在程序启动后立即卡住。具体
这件事困扰了我好几天。问题是我对 C 中的指针和地址不太了解,所以我希望有人能够帮助我。 我需要传递一些字符串作为输入参数,并创建尽可能多的生产者进程 + 一个消费者进程。 生产者应该将字符串分开并将
为了学习,我写了 2 个 IPC 程序,一个服务器和一个使用消息发送的客户端。由于某种原因,服务器似乎没有收到它已发送的数据。关于如何调试此类问题,您能给我一些提示吗? #include #incl
程序创建了两个子进程。第一个子进程 (1) 从 stdin 读取文本,删除任何特殊字符,然后拆分成单词。该程序的那部分工作得很好。然后,当 child (1) 拆分单词时,它通过消息队列发送每个完整的
msgsnd() 和 msgrcv() 在同一个函数中,它与第一个示例一样运行良好。 主.c #include #include #include int main(int argc, char
谁能帮我指出我程序中的错误是什么? 提前致谢,粉碎王1 #include #include #include #include #include #include #include ty
这是我的问题:我正在尝试在服务器和客户端之间实现消息队列。为此,我有两个文件,msq-server.c和 msq-client.c . 我使用函数 msgctl(msqid, IPC_RMID, &b
我编写了一个 C 程序来测试并行进程上的一些消息队列。消息定义如下: typedef struct _Message{ long type; int some_number;
我是一名优秀的程序员,十分优秀!