在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>文件I/O編程之文件讀寫及上鎖實驗

文件I/O編程之文件讀寫及上鎖實驗

2017-10-18 | rar | 0.4 MB | 次下載 | 1積分

資料介紹

 6.6 實驗內容
  6.6.1 文件讀寫及上鎖
  1.實驗目的
  通過編寫文件讀寫及上鎖的程序,進一步熟悉Linux中文件I/O相關的應用開發,并且熟練掌握open()、read()、write()、fcntl()等函數的使用。
  2.實驗內容
  在Linux中FIFO是一種進程之間的管道通信機制。Linux支持完整的FIFO通信機制。
  本實驗內容比較有趣,通過使用文件操作,仿真FIFO(先進先出)結構以及生產者-消費者運行模型。
  本實驗中需要打開兩個虛擬終端,分別運行生產者程序(producer)和消費者程序(customer)。此時兩個進程同時對同一個文件進行讀寫操作。因為這個文件是臨界資源,所以可以使用文件鎖機制來保證兩個進程對文件的訪問都是原子操作。
  先啟動生產者進程,它負責創建仿真FIFO結構的文件(其實是一個普通文件)并投入生產,就是按照給定的時間間隔,向FIFO文件寫入自動生成的字符(在程序中用宏定義選擇使用數字還是使用英文字符),生產周期以及要生產的資源數通過參數傳遞給進程(默認生產周期為1s,要生產的資源數為10個字符)。
  后啟動的消費者進程按照給定的數目進行消費,首先從文件中讀取相應數目的字符并在屏幕上顯示,然后從文件中刪除剛才消費過的數據。為了仿真FIFO結構,此時需要使用兩次復制來實現文件內容的偏移。每次消費的資源數通過參數傳遞給進程,默認值為10個字符。
  3.實驗步驟
  (1)畫出實驗流程圖。
  本實驗的兩個程序的流程圖如圖6.4所示。
  文件I/O編程之文件讀寫及上鎖實驗
  圖6.4 節流程圖
  (2)編寫代碼。
  本實驗中的生產者程序的源代碼如下所示,其中用到的lock_set()函數可參見第6.3.2節。
  /* producer.c */
  #include 《stdio.h》
  #include 《unistd.h》
  #include 《stdlib.h》
  #include 《string.h》
  #include 《fcntl.h》
  #include “mylock.h”
  #define MAXLEN 10 /* 緩沖區大小最大值*/
  #define ALPHABET 1 /* 表示使用英文字符 */
  #define ALPHABET_START ‘a’ /* 頭一個字符,可以用 ‘A’*/
  #define COUNT_OF_ALPHABET 26 /* 字母字符的個數 */
  #define DIGIT 2 /* 表示使用數字字符 */
  #define DIGIT_START ‘0’ /* 頭一個字符 */
  #define COUNT_OF_DIGIT 10 /* 數字字符的個數 */
  #define SIGN_TYPE ALPHABET /* 本實例選用英文字符 */
  const char *fifo_file = “。/myfifo”; /* 仿真FIFO文件名 */
  char buff[MAXLEN]; /* 緩沖區 */
  /* 功能:生產一個字符并寫入仿真FIFO文件中 */
  int product(void)
  {
  int fd;
  unsigned int sign_type, sign_start, sign_count, size;
  static unsigned int counter = 0;
  /* 打開仿真FIFO文件 */
  if ((fd = open(fifo_file, O_CREAT|O_RDWR|O_APPEND, 0644)) 《 0)
  {
  printf(“Open fifo file error\n”);
  exit(1);
  }
  sign_type = SIGN_TYPE;
  switch(sign_type)
  {
  case ALPHABET:/* 英文字符 */
  {
  sign_start = ALPHABET_START;
  sign_count = COUNT_OF_ALPHABET;
  }
  break;
  case DIGIT:/* 數字字符 */
  {
  sign_start = DIGIT_START;
  sign_count = COUNT_OF_DIGIT;
  }
  break;
  default:
  {
  return -1;
  }
  }/*end of switch*/
  sprintf(buff, “%c”, (sign_start + counter));
  counter = (counter + 1) % sign_count;
  lock_set(fd, F_WRLCK); /* 上寫鎖*/
  if ((size = write(fd, buff, strlen(buff))) 《 0)
  {
  printf(“Producer: write error\n”);
  return -1;
  }
  lock_set(fd, F_UNLCK); /* 解鎖 */
  close(fd);
  return 0;
  }
  int main(int argc ,char *argv[])
  {
  int time_step = 1; /* 生產周期 */
  int time_life = 10; /* 需要生產的資源數 */
  if (argc 》 1)
  {/* 第一個參數表示生產周期 */
  sscanf(argv[1], “%d”, &time_step);
  }
  if (argc 》 2)
  {/* 第二個參數表示需要生產的資源數 */
  sscanf(argv[2], “%d”, &time_life);
  }
  while (time_life--)
  {
  if (product() 《 0)
  {
  break;
  }
  sleep(time_step);
  }
  exit(EXIT_SUCCESS);
  }
  本實驗中的消費者程序的源代碼如下所示。
  /* customer.c */
  #include 《stdio.h》
  #include 《unistd.h》
  #include 《stdlib.h》
  #include 《fcntl.h》
  #define MAX_FILE_SIZE 100 * 1024 * 1024 /* 100M*/
  const char *fifo_file = “。/myfifo”; /* 仿真FIFO文件名 */
  const char *tmp_file = “。/tmp”; /* 臨時文件名 */
  /* 資源消費函數 */
  int customing(const char *myfifo, int need)
  {
  int fd;
  char buff;
  int counter = 0;
  if ((fd = open(myfifo, O_RDONLY)) 《 0)
  {
  printf(“Function customing error\n”);
  return -1;
  }
  printf(“Enjoy:”);
  lseek(fd, SEEK_SET, 0);
  while (counter 《 need)
  {
  while ((read(fd, &buff, 1) == 1) && (counter 《 need))
  {
  fputc(buff, stdout); /* 消費就是在屏幕上簡單的顯示 */
  counter++;
  }
  fputs(“\n”, stdout);
  close(fd);
  return 0;
  }
  /* 功能:從sour_file文件的offset偏移處開始
  將count個字節數據復制到dest_file文件 */
  int myfilecopy(const char *sour_file,
  const char *dest_file, int offset, int count, int copy_mode)
  {
  int in_file, out_file;
  int counter = 0;
  char buff_unit;
  if ((in_file = open(sour_file, O_RDONLY|O_NONBLOCK)) 《 0)
  {
  printf(“Function myfilecopy error in source file\n”);
  return -1;
  }
  if ((out_file = open(dest_file,
  O_CREAT|O_RDWR|O_TRUNC|O_NONBLOCK, 0644)) 《 0)
  {
  printf(“Function myfilecopy error in destination file:”);
  return -1;
  }
  lseek(in_file, offset, SEEK_SET);
  while ((read(in_file, &buff_unit, 1) == 1) && (counter 《 count))
  {
  write(out_file, &buff_unit, 1);
  counter++;
  }
  close(in_file);
  close(out_file);
  return 0;
  }
  /* 功能:實現FIFO消費者 */
  int custom(int need)
  {
  int fd;
  /* 對資源進行消費,need表示該消費的資源數目 */
  customing(fifo_file, need);
  if ((fd = open(fifo_file, O_RDWR)) 《 0)
  {
  printf(“Function myfilecopy error in source_file:”);
  return -1;
  }
  /* 為了模擬FIFO結構,對整個文件內容進行平行移動 */
  lock_set(fd, F_WRLCK);
  myfilecopy(fifo_file, tmp_file, need, MAX_FILE_SIZE, 0);
  myfilecopy(tmp_file, fifo_file, 0, MAX_FILE_SIZE, 0);
  lock_set(fd, F_UNLCK);
  unlink(tmp_file);
  close(fd);
  return 0;
  }
  int main(int argc ,char *argv[])
  {
  int customer_capacity = 10;
  if (argc 》 1) /* 第一個參數指定需要消費的資源數目,默認值為10 */
  {
  sscanf(argv[1], “%d”, &customer_capacity);
  }
  if (customer_capacity 》 0)
  {
  custom(customer_capacity);
  }
  exit(EXIT_SUCCESS);
  }
  (3)先在宿主機上編譯該程序,如下所示:
  $ make clean; make
  (4)在確保沒有編譯錯誤后,交叉編譯該程序,此時需要修改Makefile中的變量
  CC = arm-linux-gcc /* 修改Makefile中的編譯器 */
  $ make clean; make
  (5)將生成的可執行程序下載到目標板上運行。
  4.實驗結果
  此實驗在目標板上的運行結果如下所示。實驗結果會和這兩個進程運行的具體過程相關,希望讀者能具體分析每種情況。下面列出其中一種情況:
  終端一:
  $ 。/producer 1 20 /* 生產周期為1s,需要生產的資源數為20個 */
  Write lock set by 21867
  Release lock by 21867
  Write lock set by 21867
  Release lock by 21867
  ……
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 国产高清免费午夜在线视频 | 狠狠色噜噜狠狠狠狠米奇7777 | 国产一区二区精品 | 日本精品卡一卡2卡3卡四卡三卡 | 久久久久久久影院 | 久久天天躁狠狠躁夜夜呲 | 午夜啪啪福利视频 | 日韩欧美视频一区 | 国产一区二区三区免费大片天美 | 色多多免费视频 | 99国产精品农村一级毛片 | 黄频网 | 男女同床爽爽视频免费 | 国产性大片黄在线观看在线放 | 国产日本久久久久久久久婷婷 | 5252a我爱haose01亚洲 | 欧美亚洲另类在线观看 | 丁香四月婷婷 | 国产午夜精品久久久久免费视 | 久久久精品免费国产四虎 | 在线天堂中文新版有限公司 | 国产福利你懂的 | 国产在线精品香蕉综合网一区 | 中文字字幕码一二区 | 天天操天天干天天 | 美国一级毛片片aa久久综合 | 一色屋成人免费精品网 | 天天av天天翘天天综合网 | 2021精品国产综合久久 | 欧美猛交喷潮在线播放 | 农村妇女野外一级毛片 | 亚洲一本视频 | 超级狂色而且免费又超好看 | 人操人| 婷婷社区五月天 | 992tv国产精品福利在线 | 国产美女在线精品免费观看 | 激情五月婷婷在线 | 午夜免费看视频 | 在线视频一区二区三区 | 成人免费视频一区二区三区 |