Linux 进程间通讯详解二

消息队列
--消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法
--每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值
--消息队列也有管道一样的不足,就是每个消息的最大长度是由上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)
消息大小的三大限制
cat /proc/sys/kernel/msgmax --最大消息的长度限制(65536)
cat /proc/sys/kernel/msgmnb --消息队列总的字节数(65536)
cat /proc/sys/kernel/msgmni --消息队列的条目数(1465)
删除消息队列命令
--ipcrm msg msqid (注意是msg不是msq)
--ipcrm -q msqid--注意:当msqid大于0时,这两个命令都可以释放消息队列,但是当msqid=0时(msqid=0这种情况很罕见),ipcrm msg msqid会报错
megget()函数
int msgget(key_t key, int msgflg);
--功能:用来创建和访问一个消息队列
--参数
    key    某个消息队列的名字
    msgflg    由九个权限标志构成,他们的用法和创建文件时使用的model模式标志是一样的
              详解:这实际上是一个字变量,int类型有32位,前面9位用来标识读写权限(rwxr--r--)
--成功返回一个非负整数,失败返回-1,并且更新errno
//消息队列
#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[])
{
    /*以可读可写方式打开消息队列,文件必须要存在,如果消息队列不存在,errno=ENOENT*/
    //int msgid=msgget(0x1234,0666);
    /*如果消息队列存在,使用现有消息队列,不存在该key值的消息队列,创建消息队列*/
    //int msgid=msgget(0x1234,0666|IPC_CREAT);
    /*如果没有该key值的消息队列,则创建消息队列,如果存在该消息队列,则报错提示文件已存在
     * 一般用于判断消息队列是否存在(防止用户使用该key值的消息队列的新内容覆盖原有内容)
     * IPC_EXCL单独使用没有效果,必须和IPC_CREAT一起使用
     * */
    //int msgid = msgget(0x1234, 0666 | IPC_CREAT | IPC_EXCL);
    /*IPC_PRIVATE创建的消息队列只供父子进程间使用
     * 每次使用IPC_PRIVATE都会创建一个新的消息队列,不会使用原来的,
     * 因为使用IPC_PRIVATE不再具有访问现有消息队列的功能
     * 所以IPC_CREAT和IPC_EXCL都没有用
     * 但是在父子进程间,因为程序还没有结束,所以父进程仍然在使用消息队列,
     * 所以子进程也可以用该消息队列与父进程交互信息
     * IPC_PRIVATE 宏  值是0
     * */
    int msgid = msgget(IPC_PRIVATE, 0666);
    if (msgid == -1)
    {
        if (errno == ENOENT)
        {
            printf("自定义错误:没有该文件!\n");
            return -1;
        }
        if (errno == EEXIST)
        {
            printf("自定义错误:该消息队列已经存在!\n");
            return -1;
        }
        perror("msgget() err");
        return -1;
    }
    printf("创建消息队列成功!id=%d \n", msgid);
    return 0;
}
//消息队列
#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[])
{
    //如果有,使用现有的,没有,创建一个
    int msgid = msgget(0x1234, 0444 | IPC_CREAT);
    if (msgid == -1)
    {
        perror("msgget() err");
        return -1;
    }
    //以可读可写的权限访问一个只读不可写的消息队列 报错
    msgid = msgget(0x1234, 0666);
    if (msgid == -1)
    {
        perror("msgget() err");
        return -1;
    }
    return 0;
}
时间: 2024-10-04 21:29:42

Linux 进程间通讯详解二的相关文章

Linux 进程间通讯详解一

进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量,System V共享内存 --socket 进程间共享内存的三种方式 --文件系统(通过系统调用读写磁盘文件,scoket)==>最慢 --Linux内核共享信息(直接在Linux内核中1进行通讯,比如管道,消息队列,信号)==>中等 --共享内存区(在自己进程内开辟一块内存,映射到系统内存)=

Linux 进程间通讯详解四

msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); --功能:把一条消息添加到消息队列中 --参数 msqid:由msgget函数返回的消息队列标识码 msgp:是一个指针,指针指向准备发送的消息 msgsz:是msgp指向的消息的长度,这个长度不含保存消息类型的那个long int长整型 msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情 --成功返回0,失败返回-1并且设置err

linux进程间通讯-System V IPC 信号量

进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在

Linux 进程间通讯方式 pipe()函数 (转载)

转自:http://blog.csdn.net/ta893115871/article/details/7478779 Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6->套接字(sicket) 在这里我们看一下第一种====管道(pipe).有名管道(fifo)见其它文章. eg :我们以前学的命令 cat  file | grep  "abc

Linux内核ROP姿势详解(二)

/* 很棒的文章,在freebuf上发现了这篇文章上部分的翻译,但作者貌似弃坑了,顺手把下半部分也翻译了,原文见文尾链接 --by JDchen */ 介绍 在文章第一部分,我们演示了如何找到有用的ROP gadget并为我们的系统(3.13.0-32 kernel –Ubuntu 12.04.5 LTS)建立了一个提权ROP链的模型.我们同时也开发了一个有漏洞的内核驱动来允许实现执行任意代码.在这一部分,我们将会使用这个内核模块来开发一个具有实践意义的ROP链:提权,修复系统,纯净退出到用户空

[转] linux系统文件流、文件描述符与进程间关系详解

http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括: 1.linux多/单进程与多/单文件对于文件流和描述符在使用时的关联情况及一些需要注意的问题. 2.fork,vfork流缓冲等对文件操作的影响. 1.linux文件系统结构 首先补充一点基础知识,了解一下linux文件系统.如下图所示: 图1 磁盘,分区和文件系统 应该明白,上图所示结构是硬盘中文件存放

Linux进程管理工具详解:htop、glances、dstat

1.进程相关知识     1.操作系统的功能:文件系统.网络功能.进程管理.内存管理.安全功能.驱动程序(Linux是一个多任务的操作系统,而且是抢占式的多任务操作系统);.OS其实就是提供虚拟的计算机,进而能够将有限的资源借助于"保护"机制分配多个同时运行的程序,即"进程"使用,从而实现了所谓的多任务 2.程序执行环境有2种: 内核模式:cpu运行内核级指令 用户模式:cpu运行普通指令 3.应用程序运行普通指令,其实是直接运行于cpu上:应用程序运行特权指令,是

Linux进程管理命令详解

一.ps命令:只显示命令运行这一刻的进程的状态  (一) /proc/:内核中的状态信息:通过这个接口输出给用户        1. 内核参数:            可设置参数:可设置其值从而调整内核运行特性的参数:/proc/sys/            状态变量:其用于输出内核中统计信息或状态信息,仅用于查看:        2. 参数:参数被模拟成文件系统类型:  (二)进程: /proc/#:在proc目录下都有一个以进程号命名的目录,这个目录存放了进程当前状态的各种信息      

Linux进程创建过程详解

本文首先使用了接口pthread_create创建一个线程,并用strace命令追踪了接口pthread_create创建线程的步骤以及涉及到的系统调用,然后讨论了Linux中线程与进程关系,最后概述了为了实现POSIX线程,Linux内核所做的修改. 一.使用pthread_create创建线程 在Linux下可以使用pthread_create来创建线程,该接口声明如下: #include <pthread.h> int pthread_create(phtread_t *thread,