- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 POSIX 消息队列制作简单的程序。我打开了四个队列,但所有返回的描述符都是零(不是 -1,这表示打开过程中出现错误)。而且当我尝试接收或发送时,我收到错误:错误的文件描述符。哪里会出现错误?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <mqueue.h>
#define _GNU_SOURCE
#define ERR(source) (fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
perror(source),kill(0,SIGKILL),\
exit(EXIT_FAILURE))
#define MSGSIZE 100
void usage(void){
fprintf(stderr,"USAGE: niepoprawna ilosc argumentow\n");
fprintf(stderr,"argumenty muszą być wieksze niz 0 \n");
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[])
{
if (argc!=5)
usage();
int dz1 = atoi(argv[1]);
int dz2 = atoi(argv[2]);
int dz3 = atoi(argv[3]);
int dz4 = atoi(argv[4]);
char* name1 = malloc(50);
if (!name1) ERR("MALLOC");
char* name2 = malloc(50);
if (!name2) ERR("MALLOC");
char* name3 = malloc(50);
if (!name3) ERR("MALLOC");
char* name4 = malloc(50);
if (!name4) ERR("MALLOC");
int pid = getpid();
if (snprintf(name1, 50, "/%d_%d", pid, dz1)<0)
ERR("snprintf");
if (snprintf(name2, 50, "/%d_%d", pid, dz2)<0)
ERR("snprintf");
if (snprintf(name3, 50, "/%d_%d", pid, dz3)<0)
ERR("snprintf");
if (snprintf(name4, 50, "/%d_%d", pid, dz4)<0)
ERR("snprintf");
mqd_t des1, des2, des3, des4;
struct mq_attr attr;
attr.mq_maxmsg=10;
attr.mq_msgsize=MSGSIZE -2;
if (des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");
printf("dekryptor: %d ", des1);
if (des2 = TEMP_FAILURE_RETRY(mq_open(name2, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");
printf("dekryptor: %d ", des2);
if (des3 = TEMP_FAILURE_RETRY(mq_open(name3, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");
printf("dekryptor: %d ", des3);
if (des4 = TEMP_FAILURE_RETRY(mq_open(name4, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");
printf("dekryptor: %d ", des4);
puts(name1);
puts(name2);
puts(name3);
puts(name4);
struct timespec timeout;
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec=0;
timeout.tv_nsec= 200000000;
char* bufor = malloc(MSGSIZE);
if (!bufor) ERR("malloc");
printf("dekryptor: %d ", des1);
if (mq_timedreceive(des1, bufor, MSGSIZE, NULL, &timeout) < 0)
ERR("mq_timedreceive");
if (mq_send(des1, bufor, MSGSIZE, NULL) < 0)
ERR("mw_send");
mq_close(des1);
mq_close(des2);
mq_close(des3);
mq_close(des4);
if(mq_unlink(name1))ERR("mq unlink");
if(mq_unlink(name2))ERR("mq unlink");
if(mq_unlink(name3))ERR("mq unlink");
if(mq_unlink(name4))ERR("mq unlink");
}
最佳答案
您没有设置 des#
mq_open
返回的值,您将其设置为 <
返回的值运算符,因为 <
优先级高于 =
.自 mq_open
成功了,< 0
返回 false
,即 0
,然后设置为所有 des#
变量。
您需要另一组括号。
if ((des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr))) < 0)
或分两步完成。
des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr));
if (des1 < 0)
关于c - mq_open 为四个队列返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37491361/
我正在尝试使用 mq_open 打开一个简单的队列,但我不断收到错误消息: "Error while opening ... Bad address: Bad address" 我也不知道为什么。 i
我有一个创建消息队列并向该队列发送消息(使用 mq_send())的程序。然后我尝试打开同一个消息队列来读取来自另一个进程的消息。但是 mq_open() 返回 -1。 open_and_write_
我正在尝试编写一个客户端和服务器,它们将使用 POSIX 消息队列交换数据。我试图通过查看我在互联网上看到的示例和类(class)的文档来做到这一点。但是,我被困住了。当我运行它时,出现“打开的文件太
我在尝试使用 C 在 POSIX 中创建消息队列时收到错误号 22。据我所知,通过与网络上可用的示例代码进行比较,我已经正确设置了参数。 这是一个片段: int open_flags;
我正在用 POSIX 消息队列制作简单的程序。我打开了四个队列,但所有返回的描述符都是零(不是 -1,这表示打开过程中出现错误)。而且当我尝试接收或发送时,我收到错误:错误的文件描述符。哪里会出现错误
我正在尝试为在 man page 中找到的 POSIX 消息队列运行示例程序对于 mq_notify。我以 ./mq '/bla' 运行它,它给我错误 mq_open: Invalid argumen
我试图从一个特权进程创建一个POSIX消息队列(等待以后读取),然后从一个非特权进程打开这个消息队列(发送消息),后面的mq_open()返回:EACCES。 如果创建进程和打开进程都是特权进程或都是
我正在尝试使用 POSIX4 消息队列。因此,我使用 mq_open 创建队列,并为我提供给它的所有选项填充一个 struct mq_attr。 当我放置 O_CREATE 标志时,他找不到队列。 这
谁能帮我指出我代码中的错误在哪里? 提前谢谢你。 这是我的代码。我删除了下面代码中的头文件。当我运行这些代码时,我总是收到 :mq_open:invalid argument #define FILE
问题总结 我正在编写一个程序,旨在 fork 多个进程,每个进程都打开一个唯一的消息队列来接收消息。然而,每次我运行我的程序时,每个 fork 进程在使用 mq_open 初始化各自的队列时都会遇到
我在尝试使用 mq_open() 调用创建 posix mq 时遇到了权限问题。我确实合并了此处提到的更改 mq_open Permission denied我查看了类似这样的其他相关帖子 https
我阅读了有关消息队列操作的信息,例如 msgget()、msgsnd() 和 msgrcv()。但是当我在堆栈溢出上搜索消息队列相关问题时,我才知道还有另一组消息队列操作,例如mq_open()、mq
我使用以下代码创建了一个消息队列。前几次它工作正常。 int main() { mqd_t mqdes; char mq_name[10] = "/mq"; int oflag
所有,以前认为我是理智的,现在不太确定了。 我正在尝试创建一个消息队列,其 mq_msgsize 属性不是 8192,这似乎是默认值。我在下面附上了我的代码——它有许多显示值的 printf。如果您能
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
即使我在我的 Makefile 中链接了 -lrt,如下所示,我仍然得到 undefined reference to 'mq_open'。请帮忙! all:get1 iserv1 get: get1
我正在尝试打开一个新的消息队列,但由于打开文件过多 (24) 错误而失败。 这是我的示例代码: #define ALERT_Q_NAME "/alert_q_test" mqd_t mqdes; in
我是一名优秀的程序员,十分优秀!