linux进程通信--消息队列

原创 2016年05月31日 10:19:07
消息队列是一种消息的链表,用户可以对消息队列写入信息,读取信息。与无名管道类似,可以实现不相关进程之间的通信,但不同的是消息队列可以实现对消息的查询读取。
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作。实现消息队列的四种操作的函数
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
    prt:指向消息结构的指针。该消息结构 msgbuf 为:
    struct msgbuf{
    long mtype;//消息类型
    char mtext[1];//消息正文}
    size_t msgsz 为消息字节数
    flag:IPC_NOWAIT 若消息并没有立即发送而调用进程会立即返回函数传入值
    0:msgsnd 调用阻塞直到条件满足为止
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
msgp:消息缓冲区
msgsz:消息字节数
msgtyp :消息类型
    0:接收消息队列中第一个消息
    大于 0:接收消息队列中第一个类型为 msgtyp 的消息Msgtype:
    小于 0:接收消息队列中第一个类型值不小于 msgtyp 绝对值且类型
    值又最小的消息
flag:MSG_NOERROR 若返回的消息比 size 字节多,则消息就会截短到size 字节,且不通知消息发送进程
    IPC_NOWAIT 若消息并没有立即发送而调用进程会立即返回函数传入值
    0:msgsnd 调用阻塞直到条件满足为止
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
cmd命令
    IPC_STAT:读取消息队列的数据结构 msqid_ds,并将其存储在
    buf 指定的地址中
    IPC_SET:设置消息队列的数据结构 msqid_ds 中的 ipc_perm 元
    素的值。这个值取自 buf 参数
    IPC_RMID:从系统内核中移走消息队列
buf:消息缓冲区

应用实例:使用消息队列实现两个进程之间的通信,发送端接收终端输入字符串,接收端将接收到的字符显示到终端,以end结束输入。
接收端实例

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdlib.h>

/************************************
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                      int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

*************************************/
#define MAX_SIZE 512
 struct msgbuf_struct
{
     long mtype;       /* message type, must be > 0 */
     char mtext[MAX_SIZE];    /* message data */
};
int main()
{

    struct msgbuf_struct data;
    char buffer[BUFSIZ];
    int msgid=-1;
    int run_flag=1;
    long int msgtyp=0;

    msgid=msgget((key_t)1234,IPC_CREAT|0666);
    if(msgid==-1)
    {
        printf("Creat message Queue failed!!\n");
        exit(EXIT_FAILURE);
    }
    while(run_flag)
    {

        if(msgrcv(msgid, (void *)&data, BUFSIZ, msgtyp, 0)==-1)
        {

            printf("recived message failed!\n");
            exit(EXIT_FAILURE);
        }
          printf("You write data is %s",data.mtext); 

        if(strncmp(data.mtext,"end",3)==0)//字符串比较函数
        {
            run_flag=0;
        }
        sleep(1);
    }
    if(msgctl(msgid,IPC_RMID, 0)==-1)
    {
        printf("close msgqueue failed!!\n");
    }
    return 0;
}

发送端实例

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdlib.h>
/************************************
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                      int msgflg);
*************************************/
#define MAX_SIZE 512
 struct msgbuf_struct
{
     long mtype;       /* message type, must be > 0 */
     char mtext[MAX_SIZE];    /* message data */
};
int main()
{

    struct msgbuf_struct data;
    char buffer[BUFSIZ];
    int msgid=-1;
    int run_flag=1;
    msgid=msgget((key_t)1234,IPC_CREAT|0666);
    if(msgid==-1)
    {
        printf("Creat message Queue failed!!\n");
        exit(EXIT_FAILURE);
    }
    while(run_flag)
    {
        printf("Enter some data:");
        fgets(buffer,BUFSIZ,stdin);
        strcpy(data.mtext,buffer);
        data.mtype=1;   //制定为发送操作
        if((msgsnd(msgid,(void*)&data,MAX_SIZE,0))==-1)   //标志位给定为0
        {
            printf("send message failed!!\n");
            exit(EXIT_FAILURE);
        }
        if(strncmp(buffer,"end",3)==0)//字符串比较函数
        {
            run_flag=0;
        }
        sleep(1);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux进程通信之消息队列

原文地址http://blog.csdn.net/ljianhui/article/details/10287879 十分感谢作者的文章,让我可以较容易的理解消息队列的使用。 一、什么是消息队...

Linux进程通信之————消息队列

Linux进程通信之————消息队列

linux进程通信---消息队列

进程通信方式----消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息,对消息队列有读权限的进程可...

UNIX/LINUX编程学习之进程通信--消息队列

转自: http://shihaiyang.iteye.com/blog/483154 一、消息队列的基本概念      消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标...
  • hcwzq
  • hcwzq
  • 2011-08-14 22:37
  • 482

Linux下进程通信之消息队列

read date from message: msg_r.c #include #include #include #include #include #include #include #incl...

Linux进程通信-消息队列

1.消息队列 消息队列也称为报文队列,消息队列是随内核持续的,只有在内核重起或显示删除一个消息队列时,该消息队列才会真正删除 系统中记录消息队列的数据结构struct ipc_ids msg_id...

【linux高级环境编程学习笔记四】消息队列进程通信

一 消息队列通信方式的优点 在unix早期进程通信方式中,信号只能传输有限的数据,管道只能传输无格式的消息流。而消息队列的通信方式则克服了这前两种通信方式的缺点。   二 消息队列的定义 消息队列就是...

Linux进程通信之System V消息队列

System V消息队列是Open Group定义的XSI,不属于POSIX标准。System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的...

linux进程通信之消息队列

消息队列      消息队列提供了⼀一种从⼀一个进程向另⼀一个进程发送⼀一个数据块的⽅方法。  每个数据块都被认 为是有⼀一个类型,接收者进程接收的数据块可以有不同的类型值
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)