使用linux共享内存机制完成Qt与应用程序之间的通信,Qt加载制作自己的共享内存静态库
首先完成共享内存小程序,源码:
shm.h头文件的程序:
#ifndef SHM_H
#define SHM_H
#ifdef __cplusplus
extern "C"{
#endif
typedef struct {
char name[4];
int age;
}people;
people* initshm(void);
void *Create_sharememory(const char *filename,unsigned int SizeCount);
void close_sharememory(void *pshare);
int get_age(people *p);
void set_age(people *p,int age);
#ifdef __cplusplus
}
#endif
#endif
再编写main.cpp函数完成静态库和头文件的调用
编译:g++ -o shm main.cpp -L. -lshm
运行:./shm
运行成功。
使用Qt程序加载前面制作的静态库
shm.cpp源文件的程序:
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <pthread.h>
#include "shm.h"
const char *shmfile="/usr/local/sharememory1/huangchao.txt";
people* initshm(void)
{
people *p = (people *)Create_sharememory(shmfile,sizeof(people));
if(p == NULL)
printf("create sharememory failed!\n");
return p;
}
void *Create_sharememory(const char *filename,unsigned int SizeCount)
{
int shm_id,fd;
key_t key;
void *pshare;
const char *path=filename;
if((fd=open(path,O_RDWR|O_CREAT))<0)
{
perror("opne");
return 0;
}
close(fd);
key=ftok(path,10);
if(key==-1)
{
perror("ftok error\n");
return 0;
}
if((SizeCount%2)!=0)
SizeCount++;
shm_id = shmget(key,SizeCount,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error\n");
return 0;
}
pshare = shmat(shm_id,NULL,0);
if(pshare==NULL)
{
return 0;
}
return pshare;
}
void close_sharememory(void *pshare)
{
if(shmdt(pshare)==-1)
perror("detach error");
}
int get_age(people *p)
{
return p->age;
}
void set_age(people *p,int age)
{
p->age=age;
}
把shm.cpp制作成静态库libshm,命令如下
g++ -c shm.cpp //生成shm.o链接文件
生成静态库,命令如下:
ar cr libshm.a shm.o //生成静态库
main.cpp源文件的程序:
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <pthread.h>
#include "shm.h"
int main()
{
int age;
people *t;
t=initshm();
set_age(t,20);
age = get_age(t);
printf("%d\n",age);
return 0;
}
再编写main.cpp函数完成静态库和头文件的调用
编译:g++ -o shm main.cpp -L. -lshm
生成了shm可执行文件
运行:./shm
运行成功。
使用Qt程序加载前面制作的静态库和头文件,分别把静态库文件libshm.a和头文件shm.h拷贝到自己所建的工程文件夹中,并在工程的源文件中添加头文件#include“shm.h”,如下所示
main.cpp源文件的程序:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "shm.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->setText("nihao");
int age;
people *t;
t=initshm();
set_age(t,20);
age = get_age(t);
ui->label->setText(QString::number(age));
}
MainWindow::~MainWindow()
{
delete ui;
}
然后在pro工程文件中加入LIBS+=-L./ -lshm这样qt就能加载非官方的静态库了。
转载的原地址:http://blog.chinaunix.net/uid-26498888-id-3270926.html
参考资料:
http://www.cnblogs.com/hicjiajia/archive/2012/05/17/2506632.html
http://hi.baidu.com/ishowfun/item/b10632f54066770fd89e7225
http://blog.163.com/hitperson@126/blog/static/130245975201151552938133/
http://blog.csdn.net/chenjin_zhong/article/details/6147858
http://it.100xuexi.com/view/otdetail/20120531/9662b7d8-e182-4808-ac4a-50cda4b09e83.html