必须有 //即使不同的消息类型依旧能接收
//想要区别开来,还是要开辟另一条队列
char mtext[N]; //消息正文 }; size:发送的消息正文的字节数 flag: IPC_NOWAIT 消息没有发送完成函数也会立即返回。 0:直到发送完成函数才返回 返回值 成功:0 出错:-1 msgrcv()消息接收函数 头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 函数原型 int msgrcv(int msgid, void* msgp, size_t size, long msgtype, int flag); 函数参数 msqid:消息队列的ID msgp:接收消息的缓冲区 size:要接收的消息的字节数 msgtype: 0:接收消息队列中第一个消息。 大于0:接收消息队列中第一个类型为msgtyp的消息. 小于0:接收消息队列中类型值不小于msgtyp的绝对值且类型值又最小的消息。 flag: 0:若无消息函数会一直阻塞 IPC_NOWAIT:若没有消息,进程会立即返回ENOMSG。 返回值 成功:接收到的消息的长度 出错:-1 msgctl()消息队列动作函数 头文件 #include <sys/types.h> #include <sys/ipc.h>#include <sys/msg.h> 函数原型 int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ); 函数参数 msqid:消息队列的队列ID cmd: IPC_STAT:读取消息队列的属性,并将其保存在buf指向的缓冲区中。 IPC_SET:设置消息队列的属性。这个值取自buf参数。 IPC_RMID:从系统中删除消息队列。 buf:消息队列缓冲区 返回值 成功:0 出错:-1 信号量 信号量(semaphore),也叫信号灯。它是不同进程间或一个给定进程内部不同线程间同步的机制。 二值信号量: 值为0或1。与互斥锁类似,资源可用时值为1,不可用时值为0。 计数信号量: 值在0到n之间。用来统计资源,其值代表可用资源数。 对信号量的操作: P操作:即申请资源,亦即将信号量值减1,可能引起进程睡眠。 V操作:即释放资源,亦即将信号量值加1,V操作从不会睡眠。 等0操作:既不是申请也不是释放资源,而是令进程阻塞直到信号量的值为0为止。 semget()信号量ID 所需头文件 #include <sys/types.h> #include <sys/ipc.h>#include <sys/sem.h> 函数原型 int semget(key_t key, int nsems, int semflg); 函数参数 key:和信号量集关联的key值 nsems: 信号量集中包含的信号量数目 semflg:信号量集的访问权限,通常为IPC_CREAT | 0666 函数返回值 成功:信号量集ID 出错:-1 semop()信号里操作函数 头文件 #include <sys/types.h>#include <sys/ipc.h> #include <sys/sem.h> 函数原型 int semop(int semid, struct sembuf opsptr, size_t nops); 函数参数 semid:信号量集ID struct sembuf { short sem_num;=>> 要操作的信号量的编号 short sem_op; =>> 0 : 等待,直到信号量的值变成0 1 : 放资源,V操作 -1 : 分配资源,P操作 short sem_flg; =>> 0/IPC_NOWAIT/SEM_UNDO }; nops: 要操作的信号量的个数 返回值 成功:0 出错:-1 semctl()信号动作函数 头文件 #include <sys/types.h> #include <sys/ipc.h>#include <sys/sem.h> 函数原型 int semctl(int semid, int semnum, int cmd…/*union semun arg*/); 函数参数 semid:信号量集ID semnum: 要修改的信号量编号 cmd: GETVAL:获取信号量的值 SETVAL:设置信号量的值 IPC_RMID:从系统中删除信号量集合 返回值 成功:0 出错:-1 练习: 1:基于消息队列的通信方式实现一个服务器/客户端模式系统: (1) s服务端从消息队列读取需要计算的两个整数,求和后把结果通过消息队列返回c客户端; (2) c客户端从键盘读取两个整数,通过消息队列发送s服务器,接收到s服务器的计算结果后显示出来 (3) 要求服务端能同时处理多个客户端的请求(1:n) 服务器端: (1) 初始化; (2) 从消息队列获取消息,接收; (3) 求和计算; (4) 给客户端发送消息 (5) 转(2) 客户端: (1) 初始化; (2) 从键盘获取两个整数; (3) 通过消息队列发送两个整数给服务器; (4) 接收服务器端消息; (5) 转(2) struct msgbuf{ long msgtype; int a; int b; int sum; }; 关键字:extern 练习:用消息队列实现“聊天室”