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