常用的进程间通信方法,消息队列,共享内存,信号量数组
直接看程序
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int main(void) { int msgid; msgid = msgget(100, IPC_CREAT | 0640); printf("msgid = %d\n", msgid); return 0; }
这里msgget函数直接产生了一个消息队列,返回一个消息队列号。
int msgget(key_t key, int msgflg);
key_t是一个标志,可以由ftok生成,可参考ftok函数。也可以自己指定。
msgflg包含了一些权限,是否创建等信息。
运行完上面程序后,用ipcs查看,在下面应该多了一则消息队列的信息,包括消息数,大小等。
下面是一个传送结构体信息的例子
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #define SIZE 16 struct student_t { unsigned long type; char name[SIZE]; int chinese; int math; }; /* struct msgbuf_t { unsigned long type; struct student_t data; }; */ int main(void) { int msgid, ret; char buffer[SIZE]; struct student_t stu; msgid = msgget(100, 0);//前提是你已经建了一个消息队列! printf("优先级: "); fgets(buffer, SIZE, stdin); stu.type = atoi(buffer); printf("姓名: "); fgets(buffer, SIZE, stdin); sscanf(buffer, "%s", stu.name); printf("语文: "); fgets(buffer, SIZE, stdin); stu.chinese = atoi(buffer); printf("数学: "); fgets(buffer, SIZE, stdin); stu.math = atoi(buffer); ret = msgsnd(msgid, &stu, sizeof(stu) - sizeof(unsigned long), 0); printf("ret = %d\n", ret); return 0; }
msgsnd是将stu中的内容发到消息队列中!
下面是一个接收的例子
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #define SIZE 16 struct student_t { unsigned long type; char name[SIZE]; int chinese; int math; }; int main(void) { int msgid, type, ret; char buffer[SIZE]; struct student_t stu; msgid = msgget(100, 0); printf("要接收的消息类型: "); scanf("%d", &type); ret = msgrcv(msgid, &stu, sizeof(stu) - sizeof(unsigned long), type, 0); if (ret > 0) { printf("type = %d, name = %s, chinese = %d, math = %d\n", stu.type, stu.name, stu.chinese, stu.math); } return 0; }
用函数msgrcv来接收其中的内容,
每运行一次,发现消息队列数减少一个,如果没有消息在队列里面,会阻塞的等待。
参数type使我们可以指定想要哪一种消息,
type == 0 返回消息队列中第一个消息
type > 0返回队列中消息类型为type的第一个消息
type < 0返回队列中消息类型值小于或等于type绝对值的消息