[Linux管道和IPC]使用信號量和共享內存進行父子進程通信

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/sem.h>
#define SHM_SIZE 1024    //共享內存的大小
int main(int argc,char *argv[])
{
  int ret,        //臨時變量
  pid,        //進程id
  sme_id,        //保存信號量描述符
  shm_id;        //保存共享內存描述符
  key_t     sme_key,    //保存信號量鍵值
  shm_key;    //保存共享內存鍵值
  char *shmp;        //指向共享內存的首地址
  struct shmid_ds dsbuf;    //定義共享內存信息結構變量
  struct sembuf lock = {0, -1, SEM_UNDO};        //信號量上鎖操作的數組指針
  struct sembuf unlock = {0, 1, SEM_UNDO | IPC_NOWAIT};//信號量解鎖操作的數組指針
  shm_key = ftok(*(argv+1), 2);    //獲取信號量鍵值
  if(shm_key < 0)
  {
    perror("ftok");    //調用ftok函數出錯
    exit(0);
  }
  sme_id = semget(shm_key, 1, IPC_CREAT | 0666);    //獲取信號量ID
  if(sme_id < 0)
  {
    perror("semget");  //調用semget函數出錯
    exit(0);
  }
  shm_key = ftok(*(argv+2), 1);    //獲取共享內存鍵值
  if(shm_key < 0)
  {
    perror("ftok");
    exit(0);
  }
  shm_id = shmget(shm_key, SHM_SIZE, IPC_CREAT | 0666);        //獲取共享內存ID
  if(shm_id < 0)
  {
    perror("shmget");
    exit(0);
  }
  shmp = shmat(shm_id, NULL, 0);        //映像共享內存
  if((int)shmp == -1)
  {
    perror("shmat");
    exit(0);
  }
  pid = fork();            //創建子進程
  if(pid < 0)
  {
    perror("fork");
    exit(0);
  }
  else if(pid == 0)        //子進程
  {
    ret = semctl(sme_id, 0, SETVAL, 1);        //初始化信號量,初值設為1
    if(ret == -1)
    {
      perror("semctl");
      exit(0);
    }
    ret = semop(sme_id, &lock, 1);        //申請訪問共享資源,鎖定臨界資源
    if(ret == -1)
    {
      perror("semop lock");
      exit(0);
    }
    sleep(4);            //讓子進程睡眠4秒
    strcpy(shmp, "hello\n");    //往共享內存寫入數據
    if(shmdt((void *)shmp) < 0)    //使共享內存脫離進程地址空間
    {
      perror("shmdt");            
    }
    ret = semop(sme_id, &unlock, 1);        //解鎖臨界資源
    if(ret == -1)
    {
      perror("semop unlock");
      exit(0);
    }
  }
  else                //父進程
  {
    sleep(1);        //先讓子進程運行
    ret = semop(sme_id, &lock, 1);        //申請訪問共享資源,鎖定臨界資源
    if(ret == -1)
    {
      perror("semop lock");
      exit(0);
    }
    if(shmctl(shm_id, IPC_STAT, &dsbuf) < 0)    //獲取共享內存信息
    {
      perror("shmctl");
      exit(0);
    }
    else            /* 共享內存的狀態信息獲取成功 */
    {
      printf("Shared Memory Information:\n");
      printf("\tCreator PID: %d\n", dsbuf.shm_cpid);         /* 輸出創建共享內存進程的標識符 */
      printf("\tSize(bytes): %d\n",dsbuf.shm_segsz);         /* 輸出共享內存的大小 */
      printf("\tLast Operator PID: %d\n",dsbuf.shm_lpid);     /* 輸出上一次操作共享內存進程的標識符 */
      printf("Received message : %s\n", (char *)shmp);        /* 從共享內存中讀取數據 */ 
    }
    if(shmdt((void *)shmp) < 0)    //使共享內存脫離進程地址空間
    {
      perror("shmdt");
      exit(0);            
    }        
    ret = semop(sme_id, &unlock, 1);        //解鎖臨界資源
    if(ret == -1)
    {
      perror("semop unlock");
      exit(0);
    }
    if(shmctl(shm_id, IPC_RMID, NULL) < 0)    /* 刪除前面創建的共享內存 */ 
    {
      perror("shmctl");
      exit(0);            
    }
    ret = semctl(sme_id, 0, IPC_RMID, NULL);    //刪除信號量
    if(ret == -1)
    {        
      perror("semctl");
      exit(0);        
    }
  }    
  return 0;
}

網頁名稱:[Linux管道和IPC]使用信號量和共享內存進行父子進程通信
文章URL:http://m.kartarina.com/article2/pgodoc.html

成都網站建設公司_創新互聯,為您提供自適應網站全網營銷推廣動態網站外貿建站網站收錄面包屑導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
主站蜘蛛池模板: 无码人妻丰满熟妇区96| 国产亚洲精久久久久久无码77777| 亚洲av极品无码专区在线观看| 无码人妻一区二区三区在线视频 | 精品无码久久久久久午夜| 蜜桃臀无码内射一区二区三区| 人妻aⅴ中文字幕无码| 亚洲va无码手机在线电影| 亚洲不卡无码av中文字幕| 欧洲精品久久久av无码电影| 精品无码中文视频在线观看| 亚洲精品无码aⅴ中文字幕蜜桃| 熟妇无码乱子成人精品| 亚洲欧洲美洲无码精品VA | 国产成人无码网站| 久久精品aⅴ无码中文字字幕重口 久久精品国产亚洲AV无码娇色 | 亚洲熟妇无码av另类vr影视| 亚洲精品无码av人在线观看| aⅴ一区二区三区无卡无码| 亚洲欧洲AV无码专区| 无码少妇一区二区性色AV| 一区二区三区无码视频免费福利| 无码的免费不卡毛片视频| 亚洲AV无码一区二区三区性色| 亚洲av日韩av无码av| 亚洲AV无码精品无码麻豆| 成人无码AV一区二区| 日本无码色情三级播放| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻系列av无码一区二区 | 亚洲日韩精品A∨片无码 | 无码人妻品一区二区三区精99| 国产免费AV片无码永久免费| 亚洲精品无码少妇30P| 中文字幕韩国三级理论无码| 69堂人成无码免费视频果冻传媒| 人妻无码第一区二区三区| 日韩精品无码一区二区三区 | 少妇性饥渴无码A区免费| 潮喷大喷水系列无码久久精品 | 国产成人亚洲综合无码精品| 精品人妻少妇嫩草AV无码专区|