Unix_Linuxオペレーティングシステム-メモDay 9(信号量)

4472 ワード

Day9


しんごうりょう


マルチプロセス間の共有リソースを管理するカーネル・メンテナンスのカウント数
たとえば、変数nによってリソースの数が表され、プロセスが1つのリソースを独占したい場合、nの値は-1(または複数)であり、nの値が0(減算が足りない)に等しい場合、プロセスはnの値が減算されてから起動されるまでブロックされ、リソースが使用された後、nの値は+1(または複数)である
  • int semget(key_t key, int nsems, int semflg);
  • 作成/取得信号量
  • key IPCキー値
  • nsems信号量の数
  • semflg
  • 0取得信号量
  • IPC_CREAT作成信号量(存在しなければ作成、存在すれば取得)
  • IPC_EXCLが既に存在する場合の作成に失敗した
  • 戻り値信号量識別
  • int semop(int semid, struct sembuf *sops, size_t nsops);
  • 操作信号量(信号を加算/減算)
  • .
  • semid信号量識別子
  • sops構造体ポインタ
  • nsopd配列長
  • struct sembuf{
        unsigned short sem_num;  /* semaphore number   */
        short          sem_op;   /* semaphore operation  */
        short          sem_flg;  /* operation flags  */
        IPC_NOWAIT // , 
        SEM_UNDO // , 
    }
    
  • int semtimedop(int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout);
  • 時間制限付き信号量動作
  • struct timespec{
        __time_t tv_sec; 
        long int tv_nsec; 
    }
    
  • int semctl(int semid, int semnum, int cmd, ...);
  • 初期化信号量の値;信号量を削除します.取得、信号量設定属性
  • cmd
  • IPC_STAT取得信号量の属性
  • IPC_SET設定信号量の属性

  • IPC_RMID削除信号量の属性
  • IPC_INFOは、信号量の情報
  • を取得する.
  • SEM_INFO設定信号量の情報
  • GETALL全信号量の値
  • を取得する.
  • GETCNT取得信号量
  • GETVALある信号量の値
  • を取得する.
  • GETZCNTは、待機中の完全な空きリソース数
  • を返す.
  • SETALL全信号量の値
  • を設定
  • SETVALある信号量の値
  • を設定する.

    union semun {
        int              val;    /* Value for SETVAL */
        struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
        unsigned short  *array;  /* Array for GETALL, SETALL */
        struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                               (Linux-specific) */
    };
    struct  seminfo {
        int semmap;  /* Number of entries in semaphore
                                             map; unused within kernel */
        int semmni;  /* Maximum number of semaphore sets */
        int semmns;  /* Maximum number of semaphores in all
                                             semaphore sets */
        int semmnu;  /* System-wide maximum number of undo
                                             structures; unused within kernel */
        int semmsl;  /* Maximum number of semaphores in a
                                             set */
        int semopm;  /* Maximum number of operations for
                                             semop(2) */
        int semume;  /* Maximum number of undo entries per
                                             process; unused within kernel */
        int semusz;  /* Size of struct sem_undo */
        int semvmx;  /* Maximum semaphore value */
        int semaem;  /* Max. value that can be recorded for
                                             semaphore adjustment (SEM_UNDO) */
                         };
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(){
    
        // 
        int semid = semget(ftok(".",100),1,IPC_CREAT|0644);
        if(0 > semid){
            perror("semget");
            return -1;
        }
        // 
        if(semctl(semid,0,SETVAL,5)){
            perror("semctl");
            return -1;
        }
        printf(" 5 ");
        // , 
        for(int i=0;i<10;i++){
            if(0 == fork()){
                // 
                struct sembuf buf = {0,-1,0};
                semop(semid,&nuf,1);
                printf("%u: , %d 
    ",getpid(),semctl(semid,0,GETVAL)); sleep(rand()%20+5);// // buf.sem_op = 1; semop(semid,&buf,1) printf("%u:
    ",getpid()); // exit(0); } } while(-1 != wait(NULL)); // semctl(semid,0,IPC_RMID); }

    プログラミングモデル:
    プロセスA
    プロセスB
    信号量の作成
    semget
    取得信号量
    イニシャル信号量
    semctl

    加減信号量
    semop
    加減信号量
    削除信号量
    semctl

    注意:信号量はカウントするためのもので、必ずリソース対応が必要です.

    IPCコマンド


    IPCオブジェクトの表示
  • ipc -m
  • ipc -q
  • ipc -s
  • ipc -a

  • IPCオブジェクトの削除
  • ipcrm -m ID
  • ipcrm -q ID
  • ipcrm -s ID