中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

進程間通信 :消息隊列的實現

發布時間:2020-07-06 21:52:58 來源:網絡 閱讀:476 作者:mdd9502053669 欄目:編程語言

一.消息隊列

    消息隊列是一個進程向另一個進程發送一個數據塊的方法,所以消息隊列是基于消息的,而管道則是基于字節流的。消息隊列提供的是進程間的雙向通信。

消息隊列中的幾個原型函數:

   1.獲取消息信息:int msgget(key_t key,int msgflag);key 是用ftok()函數創建的

   2.接收消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

   3.發送消息:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

   4.銷毀消息信息:int msfctl(int msgid)

查看key值命令:ipcs -q

刪除key值命令:ipcs -q key值                    

//comm.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define _PATH_ "."  //路徑
#define _PROJ_ID_ 0x7777  
#define _BLOCK_SIZE_ 1024
#define _CLIENT_TYPE_ 1
#define _SERVER_TYPE_ 2
struct msgBuf  //定義一個消息結構體
{
  long mtype; //消息類型
  char mtext[_BLOCK_SIZE_];
 };

static int creat_msg_queue(); 
int get_msg_queue();
int send_msg_queue(int msg_id,const char*info,long type);
int recv_msg_queue(int msg_id,char info[],long type);
int destroy_msg_queue(int msg_id);

//comm.c

#include"comm.h"

int get_msg_queue()
{
  return creat_msg_queue();
 }

static int creat_msg_queue()
{
  key_t key=ftok(_PATH_,_PROJ_ID_);
  if(key<0)
   {
     perror("ftok");
     return -1;
    }
  int msg_id=msgget(key,IPC_CREAT);
  if(msg_id<0)
  {
    perror("msgget");
    return -1;
   }

   return msg_id;
}


int send_msg_queue(int msg_id,const char*info,long type)//將要發送的消息存入mtext中
{
   struct msgBuf msg;
   msg.mtype=type;
   memset(msg.mtext,'\0',sizeof(msg.mtext));
   strcpy(msg.mtext,info);
   if(msgsnd(msg_id,&msg,sizeof(msg.mtext),0)<0)
   {
     perror("msgsnd");
     return -1;

    }
    return 0;
}

int recv_msg_queue(int msg_id,char* info,long type)//將mtext中的消息拿出放入info中
{
  struct msgBuf msg;
  if(msgrcv(msg_id,&msg,sizeof(msg.mtext),type,0)<0)
  {  
     perror("msgrcv");
     return -1;
   }
   strcpy(info,msg.mtext);
   return 0;
}

int destroy_msg_queue(int msg_id)
{
  if(msgctl(msg_id,IPC_RMID,NULL)<0)
  {
    perror("msgctl");
    return -1;
  }
  return 0;

}
                                                                                         //server.c  先發送后接收
                                                                                         
#include"comm.h"

int main()
{
  int msgid=get_msg_queue();
  if(msgid<0)
  {
    exit(1);
   }
   char info[_BLOCK_SIZE_];

   while(1)
   {
     memset(info,'\0',sizeof(info));
     printf("please input:");
     fflush(stdout);
     gets(info);
     if(send_msg_queue(msgid,info,_SERVER_TYPE_)<0)
      {
        printf("send  information failed\n");
        exit(1);
       }
      if(recv_msg_queue(msgid,info,_CLIENT_TYPE_)<0)
      {
        printf("recieve information failed\n");
        exit(1);
     }
     printf("client:%s\n",info);
}
  destroy(msgid);
  return 0;
}


//client.c 先接收后發送
 #include"comm.h"
 int main()
{
   int msgid=get_msg_queue();
    if(msgid<0)
     {
      exit(1);
      }
     char info[_BLOCK_SIZE_];
     memset(info,'\0',sizeof(info));
     printf("when input stop endding...\n");
     while(1)
     {
        if(recv_msg_queue(msgid,info,_SERVER_TYPE_)<0)
          {
            printf("recieve information failed\n");
            exit(1);
           }
       else
         {
   
           if(strcmp("stop",info)==0)
           {
             return 0;
            }
          printf("server :%s\n",info);
         }

      printf("please input:");
      fflush(stdout);
      gets(info);
      if(send_msg_queue(msgid,info,_CLIENT_TYPE_)<0)
       {
         printf("send information failed\n");
         exit(1);
        }
    }
  destroy(msgid);
  return 0;

}

運行結果:

進程間通信 :消息隊列的實現






向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌拉特前旗| 调兵山市| 肇州县| 石渠县| 循化| 三明市| 永新县| 房产| 大埔区| 昭通市| 兴义市| 江源县| 象州县| 蒙城县| 富源县| 锡林郭勒盟| 隆德县| 扶余县| 思茅市| 六盘水市| 深水埗区| 东明县| 古田县| 溆浦县| 秭归县| 华坪县| 凌云县| 平舆县| 伊金霍洛旗| 宿迁市| 湾仔区| 赤水市| 阜南县| 德令哈市| 东方市| 崇义县| 英超| 绍兴市| 长武县| 明水县| 麻江县|