2

有一个问题。我有一个文件,其内容看起来像number:error_description。现在我需要把这个文件放到共享内存(POSIX)中。如果修改了任何内容,则应将其保存到 base-file。需要在共享内存中搜索内容(结果将通过消息队列发送到客户端)。我如何实现这一切?首先我认为我必须打开(fopen("my_file", "r"))然后我必须创建共享内存并映射文件。有人能帮我吗?

编辑:

#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;
}

到目前为止,这就是我现在所拥有的。读一行作品。如何更改内容?

4

1 回答 1

2

不要使用fopen和忘记共享内存(sh*我的意思是 API)。mmap这就是我们所需要的。

open使用正确的选项(读/写)打开您的文件。然后mmap与选项一起使用MAP_SHARED。文件中的所有更改都将直接反映并且对映射同一文件的所有进程可见。在 Linux 和 Solaris 上(在我不知道的其他系统上,但 POSIX 或任何标准都不能保证)你甚至可以使用read/同时访问该文件write。不过这是个坏主意。当然,来自不同进程的并发内存访问需要同步(互斥锁、信号量等)。

于 2013-01-04T20:37:51.940 回答