Linux 进程间通讯详解四

msgsnd函数
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
--功能:把一条消息添加到消息队列中
--参数
    msqid:由msgget函数返回的消息队列标识码
    msgp:是一个指针,指针指向准备发送的消息
    msgsz:是msgp指向的消息的长度,这个长度不含保存消息类型的那个long int长整型
    msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情
--成功返回0,失败返回-1并且设置errno
--msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误
--消息结构在两方面受到制约。首先,它必须小于系统规定的上限值;其次,它必须以一个long int长整数开始,接收者函数将利用这个长整数确定消息的类型
struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };
//消息队列--msgsnd
#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>

//发送消息的结构体
struct msgbuf
{
    long mtype; /* message type, must be > 0 */
    char mtext[1024]; /*这是占位符,由程序员自己决定发送消息的数组长度 */
};

int main(int arg, char * args[])
{
    int msqid = msgget(0x1234, 0666 | IPC_CREAT);
    if (msqid == -1)
    {
        perror("msgget() err");
        return -1;
    }
    printf("创建消息队列成功!msqid=%d\n", msqid);
    //发送消息
    struct msgbuf buf;
    memset(&buf,0,sizeof(buf));
    buf.mtype=1;
    strcpy(buf.mtext,"这是我发送的消息体-aaaaaaabbbbaaaaaaaa1111111aa!\n");
    int ret=msgsnd(msqid,&buf,20,IPC_NOWAIT);
    if(ret==-1)
    {
        perror("msgsnd() err");
        return -1;
    }
    printf("消息发送成功!\n");
    return 0;
}
时间: 2024-10-21 13:25:37

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

Linux 进程间通讯详解二

消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的最大长度是由上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 消息大小的三大限制 cat /proc/sys/kernel/msgmax --最大消息的长度限制(65536) cat /proc/sys/kernel/msg

Linux 进程间通讯详解一

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

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系统文件流、文件描述符与进程间关系详解

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,

Linux进程管理工具详解

 进程管理工具 查看进程 pstree  显示进程树 -p:显示PID ps 搜索进程 ps | grep pgrep pidof 系统监控工具 uptime free top 第一行:当前系统时间  系统启动到现在所经过的时间  当前上线用户数  系统在1,5,15分钟的平均负载 相当于uptime命令:交互按键:l 注意:平均负载值越小,系统越空闲:如果高于1,当前系统负载过高 第二行:显示的是目前进程总量与个别程序在什么状态(running,sleeping,stopped,zombie)