Linux 进程间通讯详解六

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 !\n");
        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("消息队列已经存在!\n");
            //访问消息队列
            msqid = msgget(key, 0666);
        } else
        {
            perror("msgget() err");
            return -1;
        }
    }
    printf("访问消息队列成功!msqid=%d\n", msqid);
    return 0;
}

 

posted on 2016-12-20 13:53  寒魔影  阅读(253)  评论(0)    收藏  举报

导航