c语言中读取内存的文件,c++从内存中读取文件内容,内容写到内存 实现文件的内存共享代码实例...

使用c++代码进行内存共享操作,内存共享可以通过key value的形式来保存内存,后面可以使用key值来直接读取内存,效率会很高/

函数说明:

shmget(key_t key, size_t size, int shmflg)(得到一个共享内存标识符或创建一个共享内存对象)

shmflg参数为模式标志参数,使用时需要与IPC对象存取权限(如0600)进行|运算来确定信号量集的存取权限

shmat(int shmid, const void *shmaddr, int shmflg)(把共享内存区对象映射到调用进程的地址空间)

shmdt(const void *shmaddr)(断开共享内存连接)

shmctl(int shmid, int cmd, struct shmid_ds *buf)(共享内存管理)

cmd

IPC_RMID:删除这片共享内存

把内容写到内存代码:

write.cpp文件:

#include

//#include

//#include

//#include

//#include

#include

#include

//#include

//#include

//#include

//#include

//#include

//#include

//#include

#include

#include

#include

//#include

//#include

//#include

using namespace std;

typedef struct{

char name[8];

int age;

} people;

#define IPCKEY 0x11

#define SHMNAME "shm_ram"

#define OPEN_FLAG O_RDWR|O_CREAT

#define OPEN_MODE 00777

#define FILE_SIZE 4096 * 4

#define LINE_SIZE 1024 * 3

int main() {

//char buff[LINE_SIZE];

//

//FILE* fp = fopen("sightline.xml", "r");

//if (NULL == fp) {

//cout << "open failure" << endl;

//return 0;

//}

//

//while(!feof(fp)){

//memset(buff, 0, LINE_SIZE);

//fgets(buff, 1024, fp);

//cout << buff;

//}

//

//fclose(fp);

cout << "Content-type: text/html; charset=\"utf-8\" \n\n";

int shm_id, i;

key_t key;

char temp[8];

people *p_map;

char pathname[30];

strcpy(pathname, ".");

key = ftok(pathname, 0);

if (key == -1) {

//perror("ftok error");

cout << "ftok error" << endl;

return 0;

}

cout << "key=" << key << endl;

//printf("key=%d\n", key);

shm_id = shmget(key, 1024 * 4, IPC_CREAT | 0666);

if (shm_id == -1) {

//perror("shmget error");

cout << "shmget error" << endl;

return 0;

}

//delete

shmctl(shm_id, IPC_RMID, NULL) ;

shm_id = shmget(key, 1024 * 4, IPC_CREAT | 0666);

if (shm_id == -1) {

//perror("shmget error");

cout << "shmget error" << endl;

return 0;

}

cout << "shm_id=" << shm_id << endl;

//printf("shm_id=%d\n", shm_id);

p_map = (people*)shmat(shm_id, NULL, 0);

memset(temp, 0x00, sizeof(temp));

strcpy(temp, "test");

temp[4] = '0';

for (i = 0; i < 7; i++) {

temp[4] += 1;

strncpy((p_map + i)->name, temp, 5);

(p_map + i)->age = 0 + i + 1;

}

shmdt(p_map);

cout << "success" << endl;

//int shm_id, i;

//key_t key;

//people *p_map;

char pathname[30];

strcpy(pathname, "/tmp");

//key = ftok("../test", IPCKEY);

//if (key == -1) {

cout << "ftok error");

//cout << "ftok error" << endl;

//return -1;

//}

printf("key=%d\n", key);

//cout << "key=" << key << endl;

//shm_id = shmget(key, 0, 0);

//if (shm_id == -1) {

cout << "shmget error");

//cout << "shmget error" << endl;

//return -1;

//}

printf("shm_id=%d\n", shm_id);

//cout << "shm_id=" << shm_id << endl;

//p_map = (people*) shmat(shm_id, NULL, 0);

//for (i = 0; i < 3; i++) {

printf("name:%s\n", (*(p_map + i)).name);

printf("age %d\n", (*(p_map + i)).age);

//cout << "name=" << (*(p_map + i)).name << endl;

//cout << "age=" << (*(p_map + i)).age << endl;

//}

//if (shmdt(p_map) == -1) {

//cout << "detach error");

//return -1;

//}

return 0;

}

编译  g++  write.cpp  -o write

执行 ./write

read.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include

#include

#include

#include

//#include

//#include

#include

#include

#include

#include

using namespace std;

typedef struct{

char name[8];

int age;

} people;

#define IPCKEY 0x11

#define SHMNAME "shm_ram"

#define OPEN_FLAG O_RDWR|O_CREAT

#define OPEN_MODE 00777

#define FILE_SIZE 4096 * 4

#define LINE_SIZE 1024 * 3

int main() {

//char buff[LINE_SIZE];

//

//FILE* fp = fopen("sightline.xml", "r");

//if (NULL == fp) {

//cout << "open failure" << endl;

//return 0;

//}

//

//while(!feof(fp)){

//memset(buff, 0, LINE_SIZE);

//fgets(buff, 1024, fp);

//cout << buff;

//}

//

//fclose(fp);

cout << "Content-type: text/html; charset=\"utf-8\" \n\n";

int shm_id, i;

key_t key;

people *p_map;

char pathname[30];

strcpy(pathname, ".");

key = ftok(pathname, 0);

if (key == -1) {

cout << "ftok error" << endl;

return 0;

}

cout << "key=" << key << endl;

shm_id = shmget(key, 0, 0);

if (shm_id == -1) {

cout << "shmget error" << endl;

return -1;

}

cout << "shm_id=" << shm_id << endl;

p_map = (people*) shmat(shm_id, NULL, 0);

for (i = 0; i < 3; i++) {

cout << "name=" << (*(p_map + i)).name << endl;

cout << "age=" << (*(p_map + i)).age << endl;

}

if (shmdt(p_map) == -1) {

cout << "detach error" << endl;

return -1;

}

return 0;

}

编译  g++  read.cpp  -o read

执行 ./read

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值