プロセス間通信——mmap()関数

5176 ワード

mmapはディスクファイルの一部をメモリに直接マッピングすることができ、ファイル内の位置に対応するメモリアドレスが直接あり、read/write関数を必要とせずにファイルの読み書きにポインタを直接使用することができます.void *mmap(void *addr,size_t length,int port,int flgs,int fd,off_t offset); int munmap(void *addr,size_t length); addrパラメータがNULLの場合、カーネルはプロセスアドレス空間で適切なアドレスを選択してマッピングを確立します.addrがNULLでない場合、カーネルにマッピングを開始する場所を示すプロンプトが表示され、カーネルはaddrの上の適切なアドレスを選択してマッピングを開始します.マッピングが確立された後、本当のヘッダアドレスは戻ることによって価値があります.lengthパラメータは、マッピングする必要があるファイルの一部の長さです.offsetパラメータは、ファイルのどこからマッピングを開始するか、ページサイズの整数倍(32ビットは通常4 K)でなければなりません.fdパラメータはファイル記述子を表す.portパラメータの値は、a、PORT_の4つです.EXEC:マッピングのこの部分が実行可能であることを示す;b、PORT_READ:マッピングのこの部分が読めることを表す;c、PORT_WRITE:マッピングされたこのセグメントを表す書き込み可能;d、PORT_NONE:マッピングされたこの部分にアクセスできないことを示します.flgsパラメータの値はいくつかありますが、現在は2つだけを理解すればいいです.MAP_SHARED:複数のプロセスが同じファイルに対して共有され、1つのプロセスがマッピングされたメモリを変更し、もう1つのプロセスもこのような変化を見ることができます.MAP_PRIVATE:複数のプロセスは同じファイルのマッピングを共有しません.1つのプロセスはマッピングのメモリを変更しました.もう1つのプロセスはこのような変化を見ることができません.本当にファイルに書くこともありません.mmapが成功するとマッピングのヘッダアドレスが返され、エラーが発生すると定数MAP_が返されるFAILED((void *)-1).プロセスが終了すると、プロセスのマッピングが自動的に解除されます.munmapを呼び出してマッピングを解除することもできます.0を正常に返し、エラーは-1を返します.適用例:前述の共有メモリの実装機能と同様に、コードを見てみましょう.
ファイルを読む
#include   
#include   
#include   
#include   
#include   
#include   
#include   

int main(int argc, char **argv)  
{  
    int fd;
    char *mapped;  
    /*   */  
    if ((fd = open(argv[1], O_RDWR)) < 0) {  
       perror("open");  
    }  

    /*   */  
    if ((mapped = (char *)mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED {  
        perror("mmap");
    }  
  /*  ,   */  
    close(fd);  

  /*   */    
     while (1) {  
        printf("%s
"
, mapped); sleep(2); } return 0; }

ファイルを書く
#include 
#include 
#include   
#include   
#include   
#include   
#include   
#include   
#include  


int main(int argc, char **argv)  
{  
        int fd, i =  0; 
         char *mapped;           
         /*   */  
          if ((fd = open(argv[1], O_RDWR,0644)) < 0) {  
                 perror("open");  
            }  

         /*   */  
         if ((mapped = (char *)mmap(NULL,1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {  
             perror("mmap");  
          }  

         /*  ,   */  
        close(fd);  

         /*   */
        while(1){
            mapped[i++] = '#';  
            mapped[i] = '\0';
            sleep(1);
        }    
        return 0;  
}