建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样
这个程序不是很理想,无法办到一个程序输入quit,两个都退出
pid大于0为父程序,通过ftok函数创建消息队列,再是msgget获得队列的id号,接着的结构体是函数msgsnd函数第二个参数,其中的mtxet是用来存储正文信息的
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if (pid > 0)
{
key_t key = ftok("./", 'B');
if (key == -1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n", key);
int msgID = msgget(key, IPC_CREAT | 0664);
if (msgID == -1)
{
perror("msgget");
return -1;
}
printf("msgID = %d\n", msgID);
struct msgbuf send;
while (1)
{
printf("消息类型:");
scanf("%ld", &send.mtype);
getchar();
printf("输入消息的正文:");
fgets(send.mtext, sizeof(send.mtext), stdin);
send.mtext[strlen(send.mtext) - 1] = '\0';
msgsnd(msgID, &send, leng, 0);
if (strcmp(send.mtext, "quit") == 0)
{
kill(pid, SIGTERM);
break;
}
}
if (msgctl(msgID, IPC_RMID, NULL) == -1)
{
printf("删除失败\n");
return -1;
}
wait(NULL);//阻塞回收
exit(EXIT_SUCCESS);
}
else if (pid == 0)
{
key_t key = ftok("./", 'C');
if (key == -1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key, IPC_CREAT | 0664);
if (msgID == -1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while (1)
{
msgrcv(msgID, &rcv, leng, 0, 0);
printf("%s\n", rcv.mtext);
if (strcmp(rcv.mtext, "quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
}