实现A B两个进程随时发收消息
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
struct msgbuf
{
long mtypeA; //消息类型,必须大于0
char mtext[128];
};
ssize_t res = 0;
struct msgbuf sndbuf;
struct msgbuf rvgbuf;
int main(int argc, const char *argv[])
{
//创建key值
key_t key = ftok("./", 20);
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %d\n", key);
//创建消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid < 0)
{
perror("msqid");
return -1;
}
printf("msqid = %d\n", msqid);
pid_t cpid = fork();
if(cpid> 0)
{
while(1)
{
/*printf("请输入消息类型>>>");
scanf("%ld", &sndbuf.mtypeA);*/
sndbuf.mtypeA = 20;
printf("请输入消息内容>>>");
fgets(sndbuf.mtext, sizeof(sndbuf.mtext), stdin); //从终端获取数据
sndbuf.mtext[strlen(sndbuf.mtext)-1] = 0;
//printf("%s\n", sndbuf.mtext);
res = msgsnd(msqid, &sndbuf, sizeof(sndbuf.mtext), 0);
if(res < 0)
{
perror("msgsnd");
}
if(strcmp(sndbuf.mtext, "quit") == 0)
{
printf("结束聊天\n");
break;
}
}
kill(0, 2);
}
// sysem("ipcs -q");
else if(cpid == 0)
{
while(1)
{
res = msgrcv(msqid, &rvgbuf, sizeof(rvgbuf.mtext),100, 0);
if(res < 0)
{
perror("msgrvc");
break;
}
if(res == 0 || strcmp(rvgbuf.mtext, "quit") == 0)
{
printf("结束聊天\n");
break;
}
//输出读取的内容
printf("%s\n", rvgbuf.mtext);
}
kill(0, 2);
}
else
{
perror("fork");
return -1;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
struct msgbuf
{
long mtypeA; //消息类型,必须大于0
char mtext[128];
};
ssize_t res = 0;
struct msgbuf sndbuf;
struct msgbuf rvgbuf;
int main(int argc, const char *argv[])
{
//创建key值
key_t key = ftok("./", 20);
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %d\n", key);
//创建消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid < 0)
{
perror("msqid");
return -1;
}
printf("msqid = %d\n", msqid);
pid_t cpid = fork();
if(cpid> 0)
{
while(1)
{
res = msgrcv(msqid, &rvgbuf, sizeof(rvgbuf.mtext),20, 0);
if(res < 0)
{
perror("msgrvc");
break;
}
if(res == 0 || strcmp(rvgbuf.mtext, "quit") == 0)
{
printf("结束聊天\n");
break;
}
printf("%s\n", rvgbuf.mtext);
}
kill(0, 2);
}
// sysem("ipcs -q");
if(cpid == 0)
{
while(1)
{
/*printf("请输入消息类型>>>");
scanf("%ld", &sndbuf.mtypeA);*/
sndbuf.mtypeA = 100;
printf("请输入消息内容>>>");
fgets(sndbuf.mtext, sizeof(sndbuf.mtext), stdin); //从终端获取数据
sndbuf.mtext[strlen(sndbuf.mtext)-1] = 0;
//printf("%s\n", sndbuf.mtext);
res = msgsnd(msqid, &sndbuf, sizeof(sndbuf.mtext), 0);
if(res < 0)
{
perror("msgsnd");
}
if(strcmp(sndbuf.mtext, "quit") == 0)
{
printf("结束聊天\n");
break;
}
}
kill(0, 2);
}
return 0;
}