消息队列发送数据和接收数据

消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent);管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制。

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。


#include
#include
#include
#include
#include
#include
#include

struct msgbuf
{
    long mytype;
    char mtext[100];
};

int main()
{
    system("ipcs -q");
    key_t key;
    if ((key_t)-1 == (key = ftok(".",'a')))
    {
        perror("ftok");
        exit(-1);
    }
    
    /*创建消息队列*/
    int msgid;
    if (-1 == (msgid = msgget(key, IPC_CREAT|0666)))
    {
        perror("msgget");
        exit(-1);
    }
    system ("ipcs -q");
    /*发送消息*/
    struct msgbuf buf;
    buf.mytype = 100;
    strcpy(buf.mtext,"hello world");
    if (-1 == msgsnd(msgid, &buf, sizeof(buf)-sizeof(long), 0))
    {
        perror("msgsnd");
        exit(-1);
    }
    
    system("ipcs -q");



    return 0;
}
#include
#include
#include
#include
#include
#include
#include

struct msgbuf
{
    long mytype;
    char mtext[100];
};

int main()
{
    system("ipcs -q");
    key_t key;
    if ((key_t)-1 == (key = ftok(".",'a')))
    {
        perror("ftok");
        exit(-1);
    }
    
    /*创建消息队列*/
    int msgid;
    if (-1 == (msgid = msgget(key, IPC_CREAT|0666)))
    {
        perror("msgget");
        exit(-1);
    }
    system ("ipcs -q");
    /*接收消息*/
    struct msgbuf buf;
    int ret;
    
    if (-1 == (ret = msgrcv(msgid, &buf, sizeof(buf) - sizeof(long),100, 0)))
    {
        perror("msgrcv");
        exit(-1);
    }

    printf("buf:%d  %s\n ",ret, buf.mtext); 
    system("ipcs -q");

    /*删除消息队列*/
    if (-1 == msgctl(msgid, IPC_RMID, NULL))
    {
        perror("msgctl");
        exit(-1);
    }
    system("ipcs -q");

    return 0;
}


 
  

 
  

你可能感兴趣的:(消息队列,线程,进程,C语言,unix,linux,通信,posix)