作業:使用消息隊列完成兩個進程間的相互通信
#include <head.h>struct msgbuf
{long mtype; //消息類型char mtext[1024]; //正文大小
};#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[])
{//1.創建key值key_t key = ftok("/", 'k');if(key == -1){perror("key create error\n");return -1;}printf("key = %#x\n", key);//2.創建消息隊列int msgid = msgget(key, IPC_CREAT|0664);if(msgid == -1){perror("msgget error\n");return -1;}//創建進程pid_t pid = fork();//3.向消息隊列中存放數據struct msgbuf buf;if(pid>0){while(1){printf("請輸入類型: ");scanf("%ld", &buf.mtype);printf("請輸入數據: ");scanf("%s",buf.mtext);//將消息放入消息隊列中msgsnd(msgid, &buf, SIZE, 0);//退出if(strcmp(buf.mtext, "quit") == 0){break;}}}else if(pid == 0){while(1){msgrcv(msgid, &buf, SIZE, 1, 0);printf("收到1號消息: %s\n", buf.mtext);if(strcmp(buf.mtext, "quit") == 0){break;}}exit(EXIT_SUCCESS);}else {perror("fork error");return -1;}//4.刪除消息隊列if(msgctl(msgid, IPC_RMID,NULL) == -1){perror("msgctl error\n");return -1;}wait(NULL);return 0;
}
#include <head.h>struct msgbuf
{long mtype; //消息類型char mtext[1024]; //正文大小
};#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[])
{//1.創建key值key_t key = ftok("/", 'k');if(key == -1){perror("key create error\n");return -1;}printf("key = %#x\n", key);//2.創建消息隊列int msgid = msgget(key, IPC_CREAT|0664);if(msgid == -1){perror("msgget error\n");return -1;}//創建進程pid_t pid = fork();//3.向消息隊列中存放數據struct msgbuf buf;if(pid>0){while(1){printf("請輸入類型: ");scanf("%ld", &buf.mtype);printf("請輸入數據: ");scanf("%s",buf.mtext);//將消息放入消息隊列中msgsnd(msgid, &buf, SIZE, 0);//退出if(strcmp(buf.mtext, "quit") == 0){break;}}}else if(pid == 0){while(1){msgrcv(msgid, &buf, SIZE, 2, 0);printf("收到1號消息: %s\n", buf.mtext);if(strcmp(buf.mtext, "quit") == 0){break;}}exit(EXIT_SUCCESS);}else {perror("fork error");return -1;}wait(NULL);//4.刪除消息隊列return 0;
}
效果圖