消息队列实现从一个进程向另一个进程发送一个数据块的方法
来源:互联网 发布:java形参 编辑:程序博客网 时间:2024/05/16 07:21
首先是Comm.h的代码
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define SERVER_TYPE 1
#define CLIENT_TYPE 2
#define SIZE 128
#define PATHNAME "."
#define PROJ_ID 0x666
struct msgbuf{
long mtype;
char mtext[SIZE];
};
int CommMsgQueue(int mgflg);
int CreateMsgQueue();
int GetMsgQueue();
int SendMsg(int msgid, long type, const char *_info);
int RecvMsg();
int DestroyMsgQueue(int msgid);
#endif
Comm.c的代码
#include"Comm.h"
int CommMsgQueue(int msgflg){
key_t key = ftok(PATHNAME,PROJ_ID);//gets key
if(key < 0)//failed
{
perror("ftok");
return -1;
}
int mspid = msgget(key,msgflg);
if(mspid < 0)//failed return -1
{
perror("msgget");
return -2;
}
return mspid;//success return mspid
}
int CreateMsgQueue()
{
return CommMsgQueue(IPC_CREAT | IPC_EXCL | 0666);//must new
}
int GetMsgQueue()
{
return CommMsgQueue(IPC_CREAT);//return has been created
}
int SendMsg(int msgid, long type, const char *_info)
{
struct msgbuf msg;
msg.mtype = type;
strcpy(msg.mtext, _info);
if(msgsnd(msgid,&msg,sizeof(msg.mtext),0) < 0)
{
perror("msgsnd");
return -1;
}
return 0;
}
int RecvMsg(int msgid,long type, char out[])
{
struct msgbuf msg;
if(msgrcv(msgid,&msg,sizeof(msg.mtext),type,0) < 0)
{
perror("msgrcv");
return -1;
}
strcpy(out,msg.mtext);
return 0;
}
int DestroyMsgQueue(int msgid)
{
if(msgctl(msgid, IPC_RMID, NULL) < 0)
{
perror("msgctl");
return -1;
}
return 0;//success
}
所有的接口已经实现完毕,现在我们分别实现通信双方的代码
首先是server.c
#include"Comm.h"
int main()
{
int msgid = CreateMsgQueue();
printf("msgid: %d\n",msgid);
char buf[SIZE];
while(1)
{
RecvMsg(msgid,CLIENT_TYPE,buf);
printf("client# %s\n",buf);
printf("Please Entry:");
fflush(stdout);
ssize_t _s = read(0,buf,sizeof(buf)-1);
if(_s > 0)
{
buf[_s-1] = '\0';
SendMsg (msgid,SERVER_TYPE,buf);
}
}
DestroyMsgQueue(msgid);
}
接着是client.c
#include"Comm.h"
int main()
{
int msgid = GetMsgQueue();
printf("msgid: %d\n",msgid);
char buf[SIZE];
while(1)
{
printf("Please Entry:");
fflush(stdout);
ssize_t _s = read(0,buf,sizeof(buf)-1);
if(_s > 0)
{
buf[_s-1] = '\0';
}
SendMsg (msgid,CLIENT_TYPE,buf);
RecvMsg(msgid,SERVER_TYPE,buf);
printf("client# %s\n",buf);
}
}
最后我们来看看makefile文件的编写
最后我们来看看结果吧
- 消息队列实现从一个进程向另一个进程发送一个数据块的方法
- 【C语言】利用kill函数实现一个进程向另一个进程发送信号
- MFC中从一个类向其他类发送消息的方法
- MFC中从一个类向其他类发送消息的方法
- mfc 一个对话框向另一个对话框发送消息
- 一个页面向另一个页面传递数据的方法
- 一个页面向另一个页面传递数据的方法
- 向消息队列发送一个消息(FIFO),OSQPost()
- Win7下用户界面特权隔离下低等级进程向高等级进程发送消息的实现
- Win7下用户界面特权隔离下低等级进程向高等级进程发送消息的实现
- 也谈android的从一个进程结束另一个进程的方式
- MFC从一个对话框向另外一个对话框发送消息
- asp.net发送电子邮件的实现(通过一个邮箱向另一个邮箱发送)
- 一个进程的输出结果在另一个进程中显示
- 嵌入式 一个进程获取另一个指定名称进程的PID
- 从一个php文件向另一个地址post数据
- 从一个php文件向另一个地址post数据
- 从一个Activity向另一个Activity传递数据
- uboot命令
- xshell远程连接ubuntu问题
- Qt程序启动画面
- JVM——深入分析对象的内存布局
- 常用集合方法汇总
- 消息队列实现从一个进程向另一个进程发送一个数据块的方法
- php检测设备
- Median of Two Sorted Arrays
- 汇编语言学习之“段地址*16+偏移地址=物理地址”的本质
- Max retries exceeded with url Error
- LeetCode 404. Sum of Left Leaves 题解
- Alexnet输入大小调整的经验
- 数据结构——线段树
- 152. Maximum Product Subarray Medium