色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>文件I/O編程之文件讀寫及上鎖實(shí)驗(yàn)

文件I/O編程之文件讀寫及上鎖實(shí)驗(yàn)

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

資料介紹

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

評論

查看更多

下載排行

本周

  1. 1AN158 GD32VW553 Wi-Fi開發(fā)指南
  2. 1.51MB   |  2次下載  |  免費(fèi)
  3. 2嵌入式軟件開發(fā)符合ISO 26262 功能安全標(biāo)準(zhǔn)
  4. 1.61 MB  |  1次下載  |  免費(fèi)
  5. 3AN148 GD32VW553射頻硬件開發(fā)指南
  6. 2.07MB   |  1次下載  |  免費(fèi)
  7. 4PZT驅(qū)動(dòng)開關(guān)電路
  8. 0.09 MB   |  1次下載  |  免費(fèi)
  9. 5模擬電路仿真實(shí)現(xiàn)
  10. 2.94MB   |  1次下載  |  免費(fèi)
  11. 6PCB繪制基礎(chǔ)知識(shí)
  12. 2.44MB   |  1次下載  |  免費(fèi)
  13. 7EE-38:ADSP-2181 IDMA端口-周期竊取時(shí)序
  14. 75.0KB   |  次下載  |  免費(fèi)
  15. 8EE-82:使用ADSP-2181 DSP的IO空間對另一個(gè)ADSP-2181進(jìn)行IDMA引導(dǎo)
  16. 86.86KB   |  次下載  |  免費(fèi)

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  452次下載  |  免費(fèi)
  3. 2免費(fèi)開源CC3D飛控資料(電路圖&PCB源文件、BOM、
  4. 5.67 MB   |  139次下載  |  1 積分
  5. 3基于STM32單片機(jī)智能手環(huán)心率計(jì)步器體溫顯示設(shè)計(jì)
  6. 0.10 MB   |  132次下載  |  免費(fèi)
  7. 4美的電磁爐維修手冊大全
  8. 1.56 MB   |  24次下載  |  5 積分
  9. 5如何正確測試電源的紋波
  10. 0.36 MB   |  19次下載  |  免費(fèi)
  11. 6感應(yīng)筆電路圖
  12. 0.06 MB   |  10次下載  |  免費(fèi)
  13. 7LZC3106G高性能諧振控制器中文手冊
  14. 1.29 MB   |  9次下載  |  1 積分
  15. 8萬用表UT58A原理圖
  16. 0.09 MB   |  9次下載  |  5 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935121次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
  4. 1.48MB  |  420062次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73810次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
主站蜘蛛池模板: 丰满大爆乳波霸奶| 在线观看成人免费| 精品无码国产自产在线观看| xxx日本免费| 在线免费观看国产视频| 午夜阳光影院在线观看视频| 暖暖视频在线高清播放| 狠狠躁日日躁人人爽| 成3d漫二区三区四区| 在线亚洲中文字幕36页| 性欧美FREE少妇XXX| 日本50人群体交乱| 美娇妻的性奴史1一4| 绞尽奶汁by菊花开| 国产精品久久久精品日日| yellow免费观看完整版直播| 2020精品极品国产色在线| 亚洲欧美中文日韩v在线| 无羞耻肉动漫在线观看| 色精品极品国产在线视频| 欧美高清另类video| 麻豆成人久久精品二区三区网站| 精品久久香蕉国产线看观看麻豆| 国产午夜精品片一区二区三区| 国产AV白丝爆浆在线播放| 成人无码在线视频区| JK白丝校花爽到娇喘视频| 97在线观看免费视频| 最近高清日本免费| 一级淫片bbbxxx| 一级淫片bbbxxx| 亚洲欧美韩国综合色| 亚洲AV久久无码精品九九软件 | 美女强奷到抽搐在线播放| 精品国产乱码久久久久久口爆| 国产午夜电影院| 国产露脸无码A区久久蘑菇| 国产99r视频精品免费观看| 朝鲜黄色录像| 国产av在在免费线观看美女| 国产成人精品免费视频下载|