Linuxの共有メモリ、プロセス間通信

1.特徴:
  1)共有メモリは、プロセスが読み込まれ、任意のデータのコピーを必要とせず、メモリに直接書き込むことができ、最も効率的なプロセス間通信の一つです。作成されたカーネル空間の後に、このようなパイプ、ユーザーが空間記憶のコピーが必要な場合は、データをコピーする必要があり、それは非効率的です。

  2)カーネルは、メモリ領域の一部がプロセスによってアクセスすることができる取り分け、複数のプロセス間で情報を交換するために、独自のプライベートアドレス空間にマッピングされる必要があります

  3)このプロセスは、直接大幅に効率を向上させる、データをコピーする必要がなく、メモリ領域を読み書きできます。

  4)プロセスの共有メモリの複数の周期、したがって我々は、ミューテックスやセマフォなど、同期のいくつかの並べ替えに依存する必要があるため

 

2.共有メモリ使用手順:

  1)/オープン共有メモリを作成します。

  2)マッピング共有メモリ。これは、アクセスするためのプロセスのアドレス空間に指定された共有メモリをマッピングすることです

  共有メモリマッピングの3)失効

  4)共有メモリ・オブジェクトを削除します

3.関連機能:

  1)key_tのftok(CONSTチャー*パス名、int型PROJ_ID)。

    機能:ユニークキー値を生成します

    パラメータ:名前と、すでにファイルにアクセスすることができますが存在します。パス名を

       PROJ_ID:文字(下位8ビットのみので)番号、鍵生成、0にすることはできません

    戻り値:成功:キー値は、失敗しました:-1

  2)INTたshmget(key_tのキー、size_tのサイズ、int型shmflg)。

    機能:共有メモリー・オブジェクトを作成または開きます

    パラメータ:keyキー、共有メモリのサイズの大きさ、shmflg IPC_CREAT | IPC_EXCL | 0777(新築かどうかのフラグ、および権限)

    戻り値:成功shmidを(ID共有メモリ);  エラー-1

  3)void *型にshmat(int型のshmidを、CONST void *型は、shmaddr、INT shmflg)。

    機能:アクセスするためのプロセスの指定された共有メモリアドレス空間にマッピングされている共有メモリのマッピング

    パラメータ:shmidを共有メモリIDの数;典型的には、shmaddrがNULLによって、ユーザが指定したNULLでない場合、マッピングは、システムによって自動的に行われることを示します

             shmflg:SHM_RDONLY現在のプロセスが共有メモリしか読むことができている0読み書き可能

    戻り値:成功:アドレスマッピングが完了し、後にエラー:住所-1

    使用方法:(P =(文字*)にshmat(shmidを、NULL、0))==(CHAR *) - 1(-1強い文字アドレスに変身します)

  4)int型にshmdt(定数void *型は、shmaddr)。

    機能:アンマップ

    パラメータ:アドレスをキャンセルするには

    戻り値:0成功、失敗-1

  5)INT shmctl(INT shmidを、INT CMD、構造体するshmid_ds * BUF)。

    各種操作のための共有メモリの機能共有メモリ)を削除:(

    :パラメータのID番号は、共有メモリをshmidを、  CMD IPC_STATは、第三のパラメータに格納されている取得した属性情報をshmidを

          IPC_SETは、第三のパラメータに設定するshmidをプロパティ情報、プロパティを設定します

          IPC_RMID:共有メモリを削除し、第三引数には、この時間はNULLです

    戻り値:0成功、  失敗-1

    用法:shmctl(shmidを、IPC_RMID、NULL);

彼は加えました:

そこに作成された後、それが表示されるまで1、IPCオブジェクトは、削除され、最後のプロセスは、あなたは、IPCオブジェクトを削除したいです

2、各IPCオブジェクトがほかに(IPCオブジェクトのプロパティ)に関連付けられたキーID値、キー値によるキー値の役割もあるIPCオブジェクト後に作成されたので、異なるプロセスは、見つけるために同一のIPCオブジェクトを開くことができ彼のIDはランダムのみIPCプロセスが直接IPCキーを通じて同じオブジェクトを開き、ID、IDを知らない他のプロセス、および他のプロセスが、このIDキーを取得するために通過するために取得することができますオブジェクトを作成し、割り当てられています。0の値は、秘密鍵を示します。ftok関数を有する異なるプロセスは、ftok及びパラメータの関数として生成されるキー値が同じままです。

例:

端末共有メモリに書き込まれた入力情報、及びプリンタの共有メモリデータによって

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    key_t key; //共享内存的唯一标识 key 值
    int shmid; //
    char *p = NULL;

    //  函数原型  key_t ftok(const char *pathname, int proj_id);;
    key = ftok("./app",'a'); //创建key值
    if(key < 0)
    {
        perror("fail ftok ");
        exit(1);
    }//共享内存 不存在,创建
    shmid = shmget(key,128,IPC_CREAT|IPC_EXCL|0777);// 创建/打开共享内存,返回id根据id映射
    if(shmid < 0) 
    {
        if(errno == EEXIST)//文件存在时,直接打开文件获取shmid
        {
            printf("file eexist");
            shmid = shmget(key,128,0777); //如果创建了,直接打开
        }
        else
        {
            perror("shmget fail ");
            exit(1);
        }
    }
    p = (char *)shmat(shmid,NULL,0);//映射,返回地址,根据地址操作,错误 返回 -1 的地址
    if( p == (char *)(-1) ) //错误形式判断
    {
        perror("shmat fail ");
        exit(1);
    }

    read(0,p,10);//从终端读数据,写入p指向的空间
    printf("%s\n",p); //打印p指向空间的内容

    shmdt(p);//解除映射

    //int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    shmctl(shmid,IPC_RMID,NULL); //删除

    return 0;
}

测试:终端输入123 写入共享内存中,然后通过共享内存打印出来



 

おすすめ

転載: www.cnblogs.com/electronic/p/10945668.html