1.键值生成
系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
头文件与函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok( const char * fname, int id )
fname就是你指定的文件名(已经存在的文件名),一般使用当前目录,如:
key_t key;
key = ftok(".", 1); 这样就是将fname设为当前目录。
2.消息队列移除
msgctl系统调用对msqid标识的消息队列执行cmd操作列
头文件与函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
返回值:
成功:0
失败:1
errno = EACCES (没有读的权限同时cmd 是IPC_STAT )
EFAULT (buf 指向的地址无效)
EIDRM (在读取中队列被删除)
EINVAL (msgqid无效, 或者msgsz 小于0 )
EPERM (IPC_SET或者IPC_RMID 命令被使用,但调用程序没有写的权限)
使用命令
IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在b u f指定的地址中。
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID::从系统内核中移走消息队列。
发送端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
int main()
{
struct msgbuf sendbuf={888,"this is message from queue"};
struct msgbuf readbuf;
key_t key;
key=ftok(".",'z');
printf("key=%x\n",key);
int msgid=msgget(0x12345,IPC_CREAT|0777);
if(msgid==-1){
printf("get queue failed\n");
}
msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
printf("send over\n");
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),988,0);
printf("return from get:%s\n",readbuf.mtext);
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
接收端代码
include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
int main()
{
struct msgbuf readbuf;
key_t key;
key=ftok(".",'z');
printf("key=%x\n",key);
int msgid=msgget(0x12345,IPC_CREAT|0777);
if(msgid==-1){
printf("get queue failed\n");
}
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),888,0);
printf("read form que:%s\n",readbuf.mtext);
struct msgbuf sendbuf={988,"thank you"};
msgsnd(msgid,&sendbuf,sizeof(sendbuf.mtext),0);
msgctl(msgid,IPC_RMID,NULL);
return 0;
}