有问题。 我有一个文件,其内容看起来像数字:error_description 。 现在我需要将此文件放入共享内存(POSIX)。如果修改了任何内容,则应将保存到基本文件。 需要在共享内存中搜索内容(结果将通过消息队列发送到客户端)。 我该如何实现这一切?首先我想我必须打开(fopen(“my_file”,“r”))然后我必须创建共享内存并mmap该文件。 有人能帮助我吗?
编辑:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
/*
* \ /tmp/errors -> Error File
*/
#define MSGQ_HANDLER "/error_handler"
#define PATH_TO_FILE "/tmp/errors"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(void) {
int fd = open(PATH_TO_FILE, O_RDWR);
struct stat file_stat;
fstat(fd, &file_stat);
printf("File size: %zd\n", file_stat.st_size);
char *byte_ptr = mmap(NULL, file_stat.st_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if(byte_ptr == MAP_FAILED){
perror("error:");
}
while(1){
printf("%s\n", byte_ptr);
if(byte_ptr)
exit(1);
}
return EXIT_SUCCESS;
}
到目前为止,这就是我现在所拥有的。 读一行有效。 如何更改内容?
答案 0 :(得分:2)
不要使用fopen
而忘记共享内存(我的意思是sh*
API)。只需要mmap
。
使用open
和正确的选项(读/写)打开文件。然后使用mmap
选项MAP_SHARED
。文件中的所有更改都将直接反映并映射到映射同一文件的所有进程。在Linux和Solaris上(在我不知道的其他系统上,但不保证POSIX或任何标准),您甚至可以使用read
/ write
同时访问该文件。不过这是一个坏主意。
当然,来自不同进程的并发内存访问需要同步(互斥,信号量等)。