1.消息队列
01msgsnd.c
#include <myhead.h> #define MSGSZ (sizeof(Msginfo) - sizeof(long)) typedef struct { long msgtype; struct { char name[16]; char age[4]; }; }Msginfo; int main(int argc, const char *argv[]) { //获取key值 key_t key; if ((key = ftok("/", 'm')) == -1) { perror("ftok"); } //创建一个消息队列 int msgid; if ((msgid = msgget(key, IPC_CREAT|0664)) == -1) { perror("msgget"); return -1; } Msginfo msg = {.msgtype = 10}; while (1) { //输入姓名年龄 printf("请输入姓名:"); fgets(msg.name, sizeof(msg.name), stdin); msg.name[strlen(msg.name) - 1] = '\0'; //换行变成结尾 printf("请输入年龄:"); fgets(msg.age, sizeof(msg.age), stdin); msg.age[strlen(msg.age) - 1] = '\0'; if (msgsnd(msgid, &msg, MSGSZ, 0) == -1) { perror("msgsnd"); return -1; } if (strcmp(msg.name, "quit") == 0) { break; } } msgctl(msgid, IPC_RMID, NULL); return 0; }
02msgrcv.c
#include <myhead.h> #define MSGSZ (sizeof(Msginfo) - sizeof(long)) typedef struct { long msgtype; struct { char name[16]; char age[4]; }; }Msginfo; int main(int argc, const char *argv[]) { //获取key值 key_t key; if ((key = ftok("/", 'm')) == -1) { perror("ftok"); } //创建一个消息队列 int msgid; if ((msgid = msgget(key, IPC_CREAT|0664)) == -1) { perror("msgget"); return -1; } Msginfo msg = {.msgtype = 10}; while (1) { if (msgrcv(msgid, &msg, MSGSZ, 0, 0) == -1) { perror("msgrcv"); return -1; } printf("name = %s, age = %s\n", msg.name, msg.age); if (strcmp(msg.name, "quit") == 0) { break; } } return 0; }
2.信号灯集