实验1.2

翻译 2015年11月20日 16:03:07

Mylock.h

 

#include<stdio.h>

#include<sys/types.h>

#include<unistd.h>

#include<fcntl.h>

#include<sys/stat.h>

 

/*structmyflock

{

   short l_type;

   off_t l_start;

   short l_whence;

   off_t l_len;

   pid_t l_pid;

};*/

 

intlock_set(int fd,int type)

{

   struct flock old_lock,lock;

   lock.l_whence = SEEK_SET;

   lock.l_start = 0;

   lock.l_len = 0;

   lock.l_type = type;

   lock.l_pid = -1;

 

   fcntl(fd,F_GETLK,&lock);

   if(lock.l_type != F_UNLCK)

   {

      if(lock.l_type == F_RDLCK)

      {

          printf("Read lock already set by%d\n",lock.l_pid);

      }

      else if(lock.l_type == F_WRLCK)

      {

          printf("Write lock already setby %d\n",lock.l_pid);

      }

   }

 

lock.l_type =type;

 

if((fcntl(fd,F_SETLKW,&lock))< 0)

{

   printf("Lock failed:type =%d\n",lock.l_type);

   return 1;

}

 

switch(lock.l_type)

{

   case F_RDLCK:

   {

      printf("Read lock set by%d\n",getpid());

   }

   break;

   case F_WRLCK:

   {

      printf("Write lock set by%d\n",getpid());

   }

   break;

   case F_UNLCK:

   {

      printf("Release lock by%d\n",getpid());

      return 1;

   }

   break;

   default:

   break;

}

   return 0;

}

 

Producer.c

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<string.h>

#include<fcntl.h>

#include"mylock.h"

 

#defineMAXLEN  10

 

#defineALPHABET      1

#defineALPHABET_START        'a'

#defineCOUNT_OF_ALPHABET       26

 

#define DIGIT       2

#defineDIGIT_START         '0'

#defineCOUNT_OF_DIGIT 10

 

#defineSIGN_TYPE ALPHABET

const char*fifo_file="./myfifo";

charbuff[MAXLEN];

 

intproduct(void)

{

       int fd;

       unsigned int sign_type,sign_start,sign_count,size;

       static unsigned int counter = 0;

 

       if((fd=open(fifo_file,O_CREAT|O_RDWR|O_APPEND,0644))< 0)

       {

              printf("Open fifo fileerror\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;

              }

       }

       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:writeerror\n");

              return -1;

       }

       lock_set(fd,F_UNLCK);

       close(fd);

       return 0;

}

 

int main(intargc,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>

#include"mylock.h"

 

#defineMAX_FILE_SIZE 100*1024*1024

 

const char*fifo_file = "./myfifo";

const char*tmp_file = "./tmp";

 

intcustoming(const char *myfifo,int need)

{

       int fd;

       char buff;

       int counter = 0;

 

       if((fd=open(myfifo,O_RDONLY)) < 0)

       {

              printf("Function customingerror\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;

}

 

intmyfilecopy(const char *sour_file,const char *dest_file,int offset,int count,intcopy_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 myfilecopyerror in source file\n");

              return -1;

       }

 

       if((out_file =open(dest_file,O_CREAT|O_RDWR|O_TRUNC| \

       O_NONBLOCK,0664)) < 0)

       {

              printf("Function myfilecopyerror 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;

}

 

intcustom(int need)

{

       int fd;

       customing(fifo_file,need);

      

       if((fd=open(fifo_file,O_RDWR)) < 0)

       {

              printf("Function myfilecopyerror in source_file");

              return -1;

       }

 

       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(intargc,char *argv[])

{

       int customer_capacity = 10;

 

       if(argc > 1)

       {

              sscanf(argv[1],"%d",&customer_capacity);

       }

       if(customer_capacity > 0)

       {

              custom(customer_capacity);

       }

       exit(EXIT_SUCCESS);

}

1.2.第一个实验——点亮LED灯

1.2.第一个实验——点亮LED灯  预备知识: (1)位、字节、IO端口、IO口       字节是内存管理的最小单位,一个字节是八位,每一位可以存放一个二进制位(0或者1)。一个IO端口包括一组I...
  • Hanfeng_1999
  • Hanfeng_1999
  • 2016年04月26日 23:31
  • 1086

1.2.第一个实验——点亮LED灯

1.2.第一个实验——点亮LED灯
  • Hanfeng_1999
  • Hanfeng_1999
  • 2016年05月09日 14:38
  • 1098

UVM系统验证基础知识1(基于UVM的verilog验证 )

需求说明:UVM系统验证 内容       :IC设计验证 来自       :时间的诗 原文:http://www.cnblogs.com/bettty/p/5285785.html A...
  • Times_poem
  • Times_poem
  • 2016年07月20日 11:00
  • 5399

数据结构实验(严蔚敏版)1.2约瑟夫环

约瑟夫环问题的一种描述是:编号为1,2,...,n的n个人按顺时针方向围坐成一个圈,每人持有一个密码(正整数),一开始任选一个正整数m作为报数的上限值,从第一个人开始顺时针自1开始顺序报数,报到m时停...
  • hqu_fritz
  • hqu_fritz
  • 2012年10月04日 11:12
  • 2422

第五周实验报告1.2

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved.* 文件名称:  *...
  • rsnsdhr
  • rsnsdhr
  • 2012年03月19日 19:06
  • 155

《数据结构》实验1.2:VC编程环境灵活应用

《数据结构》实验一:      VC编程工具的灵活使用 一..实验目的      复习巩固VC编程环境的使用,以及C++模板设计。 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握V...
  • chenjianxin1645
  • chenjianxin1645
  • 2014年09月21日 19:05
  • 494

SSD1实验报告——Lab1.2

中南大学软件工程SSD1实验课,Lab1.2实验报告。 博客内容仅供参考,如果您需解决具体问题,建议您详细咨询相关领域专业人士。...
  • qq_36731677
  • qq_36731677
  • 2016年11月21日 18:33
  • 291

南邮数据结构实验1.2 单链表的操作

[ code=C/C++ ]  #include using namespace std; const int SIZE=20 ; template class Linear...
  • think_ycx
  • think_ycx
  • 2014年10月02日 22:29
  • 520

TX2440 裸跑实验-汇编C语言混编(ADS1.2编译) 进阶(二)

TX2440 裸跑实验-汇编C语言混编(ADS1.2编译) 进阶(二) 一.实验目的: 理解汇编的编程结构,有助于学习ARM汇编与C语言的调用关系,熟悉堆栈的调用关系. 二.实验环境: TX2...
  • EastonWoo
  • EastonWoo
  • 2013年04月21日 22:49
  • 1244

python 实现斯坦福机器学习实验1.2

1、numpy和octave的标准差的算法包要注意使用参数ddof,numpy.std(axis=0, ddof=1)# % Machine Learning Online Class # Exer...
  • u012759262
  • u012759262
  • 2017年06月10日 14:09
  • 149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实验1.2
举报原因:
原因补充:

(最多只允许输入30个字)