ftok()函数
key_t ftok(const char *pathname, int proj_id);
--功能:创建系统建立IPC通讯 (消息队列、信号量和共享内存) 时key值
--参数
pathname 路径名
proj_id 是一个子序列号,虽然是Int类型,但是只使用了8bit,大小是1-255,proj_id是一个非零值
--成功返回key值,失败返回-,并且设置errno
getenv()函数
char *getenv(const char *name);
--获取环境变量name的内容
--参数
name 环境变量的名字
--成功返回一个指针,指向环境变量name的内容,失败返回NULL
//消息队列--msgctl()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> int main(int arg, char * args[])
{
/*
* 首先创建一个SENDFILE文件,这文件用来创建一个唯一的key值
* 然后在$HOME/.bash_profile文件下添加一个环境变量节点
* 例如:export SENDFILE=$HOME/etc/SENDFILE
* 接着使用getenv()函数获取环境变量的值
* 调用ftok()生成唯一的key值
* 最后再调用msgget()函数
* */
//获取环境变量的值
char *pvalue = getenv("SENDFILE");
if (pvalue == NULL)
{
printf("getenv() failed !\n");
return -;
}
key_t key = ftok(pvalue, );
if (key == -)
{
perror("ftok() err");
return -;
}
int msqid = msgget(key, | IPC_CREAT | IPC_EXCL);
if (msqid == -)
{
//该消息队列已经存在
if (errno == EEXIST)
{
printf("消息队列已经存在!\n");
//访问消息队列
msqid = msgget(key, );
} else
{
perror("msgget() err");
return -;
}
}
printf("访问消息队列成功!msqid=%d\n", msqid);
return ;
}