zoukankan      html  css  js  c++  java
  • linux IPC 消息队列(二)

    我在网上想找多进程之间的通信方式,发现有人写的消息队列很好,搬过来:

    common.h

     1 #ifndef __COMMON_H_
     2 #define __COMMON_H_
     3 
     4 #include <stdio.h>
     5 #include <unistd.h>
     6 #include <stdlib.h>
     7 #include <sys/ipc.h>
     8 #include <sys/msg.h>
     9 #include <sys/types.h>
    10 #include <string.h>
    11 #include <time.h>
    12 
    13 #define MSG_SIZE 1024
    14 #define FILEPATH "."
    15 #define ID       0
    16 #define SERVER_TYPE 1
    17 #define CLIENT_TYPE 2
    18 
    19 typedef struct msg_info {
    20         long mtype;
    21         char mtext[MSG_SIZE];
    22 }msginfo;
    23 
    24 int CreateMessageQueue();
    25 int GetMessageQueue();
    26 int DeleteMessageQueue(int msgid);
    27 int SendDataToMessageQueue(int msg_id, int send_type, char *msg);
    28 int ReceiveDataFromMessageQueue(int msg_id, int receive_type, char *out);
    29 
    30 #endif

    common.c

     1 #include "common.h"
     2 
     3 static int CommonMessageQueue(int flags)
     4 {
     5         key_t _key = ftok(FILEPATH, ID);
     6         if(_key == -1) {
     7                 perror("ftok error");
     8                 return 1;
     9         }
    10         int _msg_id = msgget(_key, flags);
    11         if(_msg_id < 0) {
    12                 perror("msgget error");
    13                 return 2;
    14         }
    15         return _msg_id;
    16 }
    17 
    18 int CreateMessageQueue()
    19 {
    20         return CommonMessageQueue(IPC_CREAT|IPC_EXCL|0666);
    21 }
    22 
    23 int GetMessageQueue()
    24 {
    25         return CommonMessageQueue(IPC_CREAT);
    26 }
    27 
    28 int DeleteMessageQueue(int msg_id)
    29 {
    30         if(msgctl(msg_id, IPC_RMID, NULL) < 0)
    31                 return -1;
    32         return 0;
    33 }
    34 
    35 int SendDataToMessageQueue(int msg_id, int send_type, char *msg)
    36 {
    37         msginfo buff;
    38         buff.mtype = send_type;
    39         strcpy(buff.mtext, msg);
    40         int msg_snd = msgsnd(msg_id, (void *)&buff, sizeof(buff), 0);
    41         if(msg_snd < 0) {
    42                 perror("msgsnd error");
    43                 return -3;
    44         }
    45         return 0;
    46 }
    47 
    48 int ReceiveDataFromMessageQueue(int msg_id, int receive_type, char *out)
    49 {
    50         msginfo buff;
    51         int msg_rcv = msgrcv(msg_id, (void *)&buff, sizeof(buff), receive_type, 0);
    52         if(msg_rcv < 0) {
    53                 perror("msg_rcv error");
    54                 return -4;
    55         }
    56         strcpy(out, buff.mtext);
    57         return 0;
    58 }

    server.c

     1 #include "common.h"
     2 
     3 int main()
     4 {
     5         char buff[MSG_SIZE];
     6         int msg_id = CreateMessageQueue();
     7 
     8         while(1)
     9         {
    10                 //send data
    11                 printf("server please enter# ");
    12                 fflush(stdout);
    13                 ssize_t s = read(0, buff, sizeof(buff)-1);
    14                 if(s > 0) {
    15                         buff[s-1] = 0;
    16                         SendDataToMessageQueue(msg_id, SERVER_TYPE, buff);
    17                         printf("data has sended,wait receive......
    ");
    18                 } else {
    19                         perror("read error");
    20                         return 1;
    21                 }
    22 
    23                 //receive data
    24                 ReceiveDataFromMessageQueue(msg_id, CLIENT_TYPE, buff);
    25                 printf("from client: %s
    ", buff);
    26         }
    27         DeleteMessageQueue(msg_id);
    28 
    29         return 0;
    30 }

    client:

     1 #include "common.h"
     2 
     3 int main()
     4 {
     5         char buff[MSG_SIZE];
     6         int msg_id = GetMessageQueue();
     7         while(1) {
     8                 //receive data
     9                 ReceiveDataFromMessageQueue(msg_id, SERVER_TYPE, buff);
    10                 printf("from server:%s
    ", buff);
    11 
    12                 //send data
    13                 printf("client please enter# ");
    14                 fflush(stdout);
    15                 ssize_t s = read(0, buff, sizeof(buff)-1);
    16                 if(s <= 0) {
    17                         perror("read error");
    18                         return 1;
    19                 } else {
    20                         buff[s-1] = 0;
    21                         SendDataToMessageQueue(msg_id, CLIENT_TYPE, buff);
    22                         printf("data has sended,wait receive......
    ");
    23                 }
    24         }
    25         return 0;
    26 }

    Makefile:

    all:client server
    
    client: common.c client.c
            gcc -o $@ $^
    server: common.c server.c
            gcc -o $@ $^
    
    .PHONY:clean
    clean:
            rm -rf client server
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/ch122633/p/8471887.html
Copyright © 2011-2022 走看看