Linux 进程间通讯详解四

Posted 庖丁解牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于Linux 进程间通讯详解四的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程间通讯详解二

Android(IPC)进程间通讯1:详解Binder由来?

Android-Binder进程间通讯机制-多图详解

进程间通讯(linux C/Python)

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

8.7 进程间的通讯:管道消息队列共享内存信号量信号Socket