ftok()函数 key_t ftok(const char *pathname, int proj_id); --功能:创建系统建立IPC通讯 (消息队列、信号量和共享内存) 时key值 --参数 pathname 路径名 proj_id 是一个子序列号,虽然是Int类型,但是只使用了8bit,大小是1-255,proj_id是一个非零值 --成功返回key值,失败返回-1,并且设置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 ! "); return -1; } key_t key = ftok(pvalue, 1); if (key == -1) { perror("ftok() err"); return -1; } int msqid = msgget(key, 0666 | IPC_CREAT | IPC_EXCL); if (msqid == -1) { //该消息队列已经存在 if (errno == EEXIST) { printf("消息队列已经存在! "); //访问消息队列 msqid = msgget(key, 0666); } else { perror("msgget() err"); return -1; } } printf("访问消息队列成功!msqid=%d ", msqid); return 0; }