• 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;
    }
  • 相关阅读:
    iis管理器的程序应用池中没有Asp.NET v4.0
    Rowlock、UPDLOCK
    转SQLSERVER 会不会自动加锁
    安装IE11必备更新
    阻止表单提交刷新页面的问题
    C#分屏控件用法实例
    Flex内存泄露解决方法和内存释放优化原则
    DataSet.Clear() Method()
    短文件名漏洞修复
    vs2017创建dotnetcore web项目,并部署到centos7上
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6202362.html
Copyright © 2020-2023  润新知