gpt4 book ai didi

c - 使用消息队列的全双工通信,连续打印消息

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

program1.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <string.h>
#define SEND_KEY 2
#define RCV_KEY 3

typedef struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mtext[100]; /* message data */
} MSG_BUF;
int main()
{
int msg_id;
MSG_BUF mbuf_snd,mbuf_rcv;

if((msg_id=msgget(5,IPC_CREAT |0644))<0)
perror("msgget");

if(fork()==0)
{
// child is receiving
while(1) {
if((msgrcv(msg_id,&mbuf_rcv,sizeof(mbuf_rcv.mtext),RCV_KEY,0))<0)
perror("msgrcv");
printf("Message : %s\n",mbuf_rcv.mtext);
}
}
else
{
// Parent is writing
while(1){
mbuf_snd.mtype=SEND_KEY;
printf("Enter the message\n");
scanf(" %[^\n]",mbuf_snd.mtext);
if((msgsnd(msg_id,&mbuf_snd,strlen(mbuf_snd.mtext)+1,0))<0)
perror("msgsnd");
}
}
return 0;
}

program2.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <string.h>
#define SEND_KEY 3
#define RCV_KEY 2

typedef struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[100]; /* message data */
}MSG_BUF;
int main()
{
int msg_id;
MSG_BUF mbuf_snd,mbuf_rcv;
if((msg_id=msgget(5,IPC_CREAT |0644))<0)
perror("msgget");
if(fork()==0)
{
//child is receiving
while(1){
if((msgrcv(msg_id,&mbuf_rcv,sizeof(mbuf_rcv.mtext),RCV_KEY,0))<0)
perror("msgrcv");
printf("Message : %s\n",mbuf_rcv.mtext);
}
}
else
{
// Parent is writing
while(1){
mbuf_snd.mtype=SEND_KEY;
printf("Enter the message\n");
scanf(" %[^\n]",mbuf_snd.mtext);
if((msgsnd(msg_id,&mbuf_snd,strlen(mbuf_snd.mtext)+1,0))<0)
perror("msgsnd");
}
}
return 0;
}

Program1 parent 正在为 mtype 2 写消息,child 从 mtype 3 接收消息。

Program2 parent 正在为 mtype 3 写消息,child 从 mtype 2 接收消息。

但是编译后没有报错。但是当我执行它时,它会不断地在屏幕上打印数据。我的要求是它应该在打印数据后停止并等待下一个数据。

你能解释一下发生了什么吗?

最佳答案

你的问题来自输入函数:

当你调用scanf时,\n留在输入流中,每次再次调用scanf时,mbuf_snd .mtext 为空,\n 留在输入流中...

修复:

scanf("%[^\n]%*c",mbuf_snd.mtext);

解释:

  • %[^\n] 会得到你想要的信息,
  • %*c 将从输入流中删除 \n。 (* 告诉 scanf 不要存储读取的字符)

其他方法:

您可以使用 fgets 函数从输入流中获取一行,它没有 scanf 复杂:

fgets(mbuf_snd.mtext, sizeof mbuf_snd.mtext, stdin)

fgets 的一个优点是很容易检测到没有要从输入流中读取的模式数据。

关于c - 使用消息队列的全双工通信,连续打印消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45274489/

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