zoukankan      html  css  js  c++  java
  • 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 !
    ");
            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;
    }
  • 相关阅读:
    Git工作原理
    将博客搬至CSDN
    Hive常见文件存储格式
    Hadoop进入安全模式源码分析
    Hadoop RPC简介
    hive自定义UDF函数
    hive性能调优之表设计层面调优
    flowable 启用慢 且启动不起来 报错看不懂
    数据结构和算法基础
    css: 边宽弧度
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6202362.html
Copyright © 2011-2022 走看看