2013-01-04 17 views
0

有問題。 我有一個內容如下的文件number:error_description。 現在我需要把這個文件共享內存(POSIX)。如果有任何內容被修改,它應該是保存到基本文件。 有必要搜索共享內存中的內容(結果將通過消息隊列發送給客戶端)。 如何實現所有這些?首先,我想我必須打開(fopen(「my_file」,「r」))然後我必須創建共享內存和mmap文件。 有人可以幫我嗎?Unix/C:將文件放入共享內存

編輯:

#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

似乎你還沒有嘗試過任何東西。試試看,在這裏問你是否需要特定的幫助。 – netcoder

+0

定義「共享內存」並解釋你已經嘗試過的內容 – user1824407

+0

@ user1824407:[共享內存](http://wikipedia.org/wiki/Shared_memory)(除非OP不知道他在說什麼)。 – netcoder

回答

2

不要使用fopen而忘記共享內存(我的意思是sh* API)。 mmap是所有需要的。

open和正確選項(讀/寫)打開文件。然後使用mmap和選項MAP_SHARED。文件中的所有更改將直接反映出來,並映射到同一文件的所有進程。在Linux和Solaris上(在其他系統上,我不知道,但不能通過POSIX或任何標準保證),您甚至可以與read/write同時訪問該文件。但這是一個糟糕的主意。當然,來自不同進程的並行內存訪問將需要同步(互斥量,信號量等)。

+0

謝謝,你能看看我的更新嗎? – x4k3p

+0

而不是使用內存映射(mmap)是否可以使用共享內存? – x4k3p

+0

到目前爲止,如果我想使用共享內存,首先我需要打開文件,創建一個新的共享內存,然後讀取文件的每一行並寫入共享內存。然後,我可以將整個共享內存寫入文件(如將文件寫入一行)。它可以變得更簡單一點嗎? – x4k3p