gpt4 book ai didi

c - 在 C 中使用消息队列时获取 "bad system call (core dumped)"

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:30 24 4
gpt4 key购买 nike

我正在尝试做一个涉及消息队列的家庭作业,当我尝试做任何事情时我收到“错误的系统调用(核心已转储)”,我不确定为什么。此外,当我使用 get_queue_ds() 函数时,它不会为我编译,但我认为这是因为我在 Windows 上使用 cygwin。任何帮助或类似代码的链接将不胜感激(搜索类似的东西没有产生任何结果)。谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MAX_SEND_SIZE 1024//Make sure I have comments

typedef struct mymsgbuf
{
long mtype; /* type of message */
long sender_id; /* sender identifier */
char msg[MAX_SEND_SIZE]; /* content of message */
}MSGBUFFER;


/* Function prototypes */
void send_message(int qid, MSGBUFFER *qbuf, long type, char *text);
void read_message(int qid, MSGBUFFER *qbuf, long type);
void remove_queue(int qid);
void change_queue_mode(int qid, char *mode);
void usage(void);

int main(int argc, char *argv[])
{
key_t myKey;
int msgqueue_id;
int qid;
MSGBUFFER* qbuf;

if(argc == 1)
usage();
else
myKey = ftok("/cis370/lab5", 1);//Creates a unique key

//Opens message queue
qid = msgget(myKey, IPC_CREAT | 0660);
if(qid == -1)
{
printf("Creating message queue failed");
exit(1);
}

switch(tolower(argv[1][0]))
{
case 's': send_message(qid, qbuf, MAX_SEND_SIZE, argv[2]);
break;
case 'r': read_message(qid, qbuf, MAX_SEND_SIZE);
break;
case 'd': remove_queue(qid);
break;
case 'm': change_queue_mode(qid, argv[2]);
break;
default: usage();
}
return(0);
}


void send_message(int qid, MSGBUFFER *qbuf, long type, char *text)
{
int length, result;
length = sizeof (MSGBUFFER) - sizeof (long);
result = msgsnd(qid, (MSGBUFFER *)qbuf, length, 0);
if (result == -1)
{
printf("Send message failed\n");
}

}


void read_message(int qid, MSGBUFFER *qbuf, long type)
{
int result, length;
length = sizeof (MSGBUFFER) - sizeof (long);
result = msgrcv(qid, (MSGBUFFER*)qbuf, length, type, 0);
if (result == -1)
{
printf("Messege read failed\n");
}
}


void remove_queue(int qid)
{
int result;
result = msgctl(qid, IPC_STAT, 0);
if (result == -1)
{
printf("Queue removal failed");
}

}



void change_queue_mode(int qid, char *mode)
{
/*struct msqid_ds tmpbuf;
int result;
//isn't working on cygwin
//get_queue_ds(qid, &tmpbuf);

sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);

result = msgctl(qid, IPC_SET, &tmpbuf);
if (result == -1)
{
printf("Queue mode change failed");
}*/

}


void usage(void)
{
printf("USAGE:\tmsgqueue\t(s)end <type> <message>\n");
printf("\t\t\t(r)ecv <type> \n");
printf("\t\t\t(d)elete\n");
printf("\t\t\t(m)ode <mode>\n");

exit(0);
}

最佳答案

Cygwin 使用特殊的后台服务来实现持久的 XSI IPC。查看 Cygserver 的文档关于如何配置和启动它。

关于c - 在 C 中使用消息队列时获取 "bad system call (core dumped)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com