2

問題があります。number:error_descriptionのような内容のファイルがあります。ここで、このファイルを共有メモリ (POSIX)に配置する必要があります。コンテンツが変更された場合は、 base-file に保存する必要があります。共有メモリ内のコンテンツを検索する必要があります (結果はメッセージ キューを介してクライアントに送信されます)。これをすべて実装するにはどうすればよいですか?最初に(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;
}

これまでのところ、それは私が今持っているものです。行の作品を読んでください。内容を変更するにはどうすればよいですか?

4

1 に答える 1

2

共有メモリ (私が意味する API) を使用fopenしたり忘れたりしないでください。必要なのはそれだけです。sh*mmap

open適切なオプション (読み取り/書き込み) を使用してファイルを開きます。次にmmap、オプションで使用しますMAP_SHARED。ファイル内のすべての変更は直接反映され、同じファイルをマップするすべてのプロセスに表示されます。Linux および Solaris (他のシステムではわかりませんが、POSIX または標準によって保証されていません) では、read/と同時にファイルにアクセスすることもできますwrite。しかし、それは悪い考えです。もちろん、異なるプロセスからの同時メモリアクセスには同期が必要です (ミューテックス、セマフォなど)。

于 2013-01-04T20:37:51.940 に答える