gpt4 book ai didi

c - 使用消息操作的二进制信号量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:09 24 4
gpt4 key购买 nike

我需要在 Linux 中使用消息操作(msgrcv、msgsnd、msgctl)实现二进制信号量。我的代码:

#include<string.h>
#include<time.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/wait.h>
#include<sys/errno.h>

extern int errno; // error NO.
#define MSGPERM 0600 // msg queue permission
#define MSGTXTLEN 60 // msg text length

int msgqid, rc;
int done;

struct msg_buf
{
long mtype;
char mtext[MSGTXTLEN];
} msg,msg2;

int main(int argc,char **argv)
{
msgqid = msgget(IPC_PRIVATE, MSGPERM|IPC_CREAT);
if (msgqid < 0)
{
perror(strerror(errno));
printf("Failed to create message with id = %d\n", msgqid);
return 1;
}
printf("Message %d created\n",msgqid);


// message to send
msg.mtype = 1; // set the type of message
sprintf (msg.mtext, "%s\n", "Old message...");
rc = msgsnd(msgqid, &msg, sizeof(msg.mtext), 0);
if (rc < 0)
{
perror( strerror(errno) );
printf("Could not send, rc = %d\n", rc);
}

// message to send
msg.mtype = 1; // set the type of message
sprintf (msg.mtext, "%s\n", "New message...");
rc = msgsnd(msgqid, &msg, sizeof(msg.mtext), 0);
if (rc < 0)
{
perror( strerror(errno) );
printf("Could not send, rc = %d\n", rc);
}

// read the message from queue
rc = msgrcv(msgqid, &msg, sizeof(msg.mtext), 0, 0);
if (rc < 0)
{
perror( strerror(errno) );
printf("Could not read, rc=%d\n", rc);
}
printf("Received message: %s\n", msg.mtext);

// remove the queue
rc=msgctl(msgqid,IPC_RMID,NULL);
if (rc < 0)
{
perror( strerror(errno) );
printf("Deleting message failed, rc=%d\n", rc);
}
printf("Message %d deleted\n",msgqid);

return 0;
}

据我了解消息操作的机制,第一条消息是用 FLAG 0 发送的,而不是 IPC_NOWAIT,所以第二条消息将无法发送。事实上,我的程序正确地打印了旧消息,但尝试发送第二条消息并没有像预期的那样以错误结束。

编辑

练习的主要目标是:“使用 channel 和消息创建二进制信号量。”指令中的示例仅包括这四个函数用法(msgget、msgsnd、msgctl、msgrcv)和一些标志。

最佳答案

man 7 svipc 看来,SysV 消息队列的唯一限制是队列中存在的字节总数。因此,您有两个解决方案:

  • 使用 msgctl 将最大字节数设置为一条消息的大小,并仅使用此精确大小的消息
  • 改用 POSIX 消息队列,它允许您使用 mq_open 指定最大消息数

关于c - 使用消息操作的二进制信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614309/

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