国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

linux共享內存實驗

發布時間:2018-7-31 10:22    發布者:嵌入式愛好
關鍵詞: linux , 嵌入式 , linux開發
  更多技術文章地址:http://www.hqyj.com/news/emb211.htm?lcg-ee
  1.實驗目的
  通過編寫共享內存實驗,進一步了解使用共享內存的具體步驟,同時加深對共享內存的理解。在本實驗中,采用信號量作為同步機制完善兩個進程(生產者”和“消費者”)之間的通信,其功能類似于4.6節中的實例。在實例中使用信號量同步機制。
  2.實驗內容
  該實現要求利用共享內存實現文件的打開和讀寫操作。
  3.實驗步驟
  (1)畫出流程圖。該實驗流程圖如圖1所示。

  圖1 實驗流程圖
  (2)編寫代碼。下面是共享內存緩沖區的數據結構的定義:
  /* shm_com.h */
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #define SHM_BUFF_SZ 2048
  struct shm_buff
  {
  int pid;
  char buffer[SHM_BUFF_SZ];
  };
  以下是“生產者”程序部分:
  /* sem_com.h 和 sem_com.c 與4.4節示例中的同名程序相同 */
  /* producer.c */
  #include "shm_com.h"
  #include "sem_com.h"
  #include
  int ignore_signal(void)
  { /* 忽略一些信號,以免非法退出程序 */
  signal(SIGINT, SIG_IGN);
  signal(SIGSTOP, SIG_IGN);
  signal(SIGQUIT, SIG_IGN);
  return 0;
  }
  int main()
  {
  void *shared_memory = NULL;
  struct shm_buff *shm_buff_inst;
  char buffer[BUFSIZ];
  int shmid, semid;
  /* 定義信號量,用于實現訪問共享內存的進程間的互斥 */
  ignore_signal(); /* 防止程序非正常退出 */
  semid = semget(ftok(".", 'a'), 1, 0666|IPC_CREAT); /* 創建一個信號量 */
  init_sem(semid);/* 初始值為1 */
  /* 創建共享內存 */
  shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT);
  if (shmid == -1)
  {
  perror("shmget failed");
  del_sem(semid);
  exit(1);
  }
  /* 將共享內存地址映射到當前進程地址空間 */
  shared_memory = shmat(shmid, (void*)0, 0);
  if (shared_memory == (void*)-1)
  {
  perror("shmat");
  del_sem(semid);
  exit(1);
  }
  printf("Memory attached at %X\n", (int)shared_memory);
  /* 獲得共享內存的映射地址 */
  shm_buff_inst = (struct shared_use_st *)shared_memory;
  do
  {
  sem_p(semid);
  printf("Enter some text to the shared memory(enter 'quit' to exit):");
  /* 向共享內存寫入數據 */
  if (fgets(shm_buff_inst->buffer, SHM_BUFF_SZ, stdin) == NULL)
  {
  perror("fgets");
  sem_v(semid);
  break;
  }
  shm_buff_inst->pid = getpid();
  sem_v(semid);
  } while(strncmp(shm_buff_inst->buffer, "quit", 4) != 0);
  /* 刪除信號量 */
  del_sem(semid);
  /* 刪除共享內存到當前進程地址空間中的映射 */
  if (shmdt(shared_memory) == 1)
  {
  perror("shmdt");
  exit(1);
  }
  exit(0);
  }
  以下是“消費者”程序部分:
  /* customer.c */
  #include "shm_com.h"
  #include "sem_com.h"
  int main()
  {
  void *shared_memory = NULL;
  struct shm_buff *shm_buff_inst;
  int shmid, semid;
  /* 獲得信號量 */
  semid = semget(ftok(".", 'a'), 1, 0666);
  if (semid == -1)
  {
  perror("Producer is'nt exist");
  exit(1);
  }
  /* 獲得共享內存 */
  shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT);
  if (shmid == -1)
  {
  perror("shmget");
  exit(1);
  }
  /* 將共享內存地址映射到當前進程地址空間 */
  shared_memory = shmat(shmid, (void*)0, 0);
  if (shared_memory == (void*)-1)
  {
  perror("shmat");
  exit(1);
  }
  printf("Memory attached at %X\n", (int)shared_memory);
  /* 獲得共享內存的映射地址 */
  shm_buff_inst = (struct shm_buff *)shared_memory;
  do
  {
  sem_p(semid); printf("Shared memory was written by process %d :%s",
  shm_buff_inst->pid, shm_buff_inst->buffer);
  if (strncmp(shm_buff_inst->buffer, "quit", 4) == 0)
  {
  break;
  }
  shm_buff_inst->pid = 0;
  memset(shm_buff_inst->buffer, 0, SHM_BUFF_SZ);
  sem_v(semid);
  } while(1);
  /* 刪除共享內存到當前進程地址空間中的映射 */
  if (shmdt(shared_memory) == -1)
  {
  perror("shmdt");
  exit(1);
  }
  /* 刪除共享內存 */
  if (shmctl(shmid, IPC_RMID, NULL) == -1)
  {
  perror("shmctl(IPC_RMID)");
  exit(1);
  }
  exit(0);
  }
  4.實驗結果
  實驗運行結果如下:
  $./producer
  Memory attached at B7F90000
  Enter some text to the shared memory(enter 'quit' to exit):First message
  Enter some text to the shared memory(enter 'quit' to exit):Second message
  Enter some text to the shared memory(enter 'quit' to exit):quit
  $./customer
  Memory attached at B7FAF000
  Shared memory was written by process 3815 :First message
  Shared memory was written by process 3815 :Second message
  Shared memory was written by process 3815 :quit

本文地址:http://www.qingdxww.cn/thread-543223-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
嵌入式愛好 發表于 2018-8-1 09:06:42
大家幫忙頂頂,鏈接內更多技術文章哦。
嵌入式愛好 發表于 2018-8-3 08:51:24
好貼不要沉,大家幫忙頂頂。
嵌入式愛好 發表于 2018-8-6 10:24:30
頂下,學者不迷路。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
  • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性一区二区三区五区 | 亚洲天堂免费视频 | 国产tv在线观看 | 正在播放国产一区 | 久久成人激情视频 | 精品国产日韩一区三区 | 欧美日韩在线成人 | 在线国产小视频 | 亚洲日韩中文字幕一区 | 国产小视频免费看 | 国产一二三区视频 | 国内外成人免费在线视频 | 亚洲app | 欧美一区二区三区久久久 | 免费大片国产在线观看下载 | 婷婷玖玖| 欧美成人性色生活片免费在线观看 | 午夜精品一区二区三区在线视 | 日本高清视频www | 免费不卡中文字幕在线 | 久久国产精品亚洲va麻豆 | 美女隐私视频黄www小说 | 拍真实国产伦偷精品 | 亚洲欧美日韩天堂 | 好吊色永久免费视频大全 | 精品国产三级在线观看 | 日日干狠狠操 | 美日韩一区二区 | 色婷婷影院在线视频免费播放 | 久久国产精品自线拍免费 | 在线观看免费小视频 | 麻豆网站免费观看 | 免费看啪啪的网站 | 免看一级一片一在线看 | 免费一级特黄a | 亚洲精品国产三级在线观看 | 精品视频69v精品视频 | 亚洲三级在线免费观看 | 最新亚洲精品国自产在线 | 一区二区在线观看视频在线 | 中文字幕日韩在线 |