消息队列
key_t ftok(char* pathname,char proj) //获得键值
返回文件名对应的键值。
pathname:文件名、路径
proj:项目名,不为0即可
int msgget(key_t key,int msgflg) //获取消息队列描述字
key:键值,通过ftok获得
msgflg:标志位 IPC_CREAT,IPC_EXCL,IPC_NOWAIT 例如 IPC_CREAT|0666;
返回与键值对应的消息队列描述字
int msgsnd(int msgid,struct msgbuf* msgp, int msgsz ,int msgflg)
//向消息队列中发送一条消息
msqid 已打开的消息队列id
msgp 存放消息的结构
struct msgbuf
{
long mtype; //消息类型,可以为int
char mtext[1]; /消息数据的首地址,不一定是mtext[1] ,
}
msgsz 消息数据长度
msgflg IPC_NOWAIT,当消息队列不够空间放要发送的消息时,指明msgsnd是否等待。
消息收发的类型要一样
int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg)
//从msqid代表的消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp
//指向的msgbuf结构中。
成功读取一条消息后,队列中的这条消息将被删除。
信号量
int semget(key_t key,int nsems, int semflg)
key 键值,由ftok获得
nsem 指定打开或新创建的信号灯集中将包含信号灯的数目
semflg 标识,同消息队列一样
int semop(int semid, struct sembuf*sops, unsigned nsops)
struct sembuf{
unsigned short sem_num; //要操作的信号量在信号量集里的编号
//第一个编号为0
short sem_op; //1为释放
short sem_flg; //IPC_NOWAIT,操作不满足时,不阻塞,返回并设定错误信息
//IPC_UNDO 程序结束时,释放信号量,避免程序在异常情况下结束时
//未将锁定的资源解锁,造成资源永远锁定。
}
sops 是一个操作数组,表明要进行什么操作
nsops sops所指向的数组的元素个数