建立两个.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;}
}