微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 文件I/O编程之: 实验内容

文件I/O编程之: 实验内容

时间:08-13 来源:3721RD 点击:

leep(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

……

终端二:

$ ./customer 5 /* 需要消费的资源数为5个 */

Enjoy:abcde /* 消费资源,即打印到屏幕上 */

Write lock set by 21872 /* 为了仿真FIFO结构,进行两次复制 */

Release lock by 21872

在两个进程结束之后,仿真FIFO文件的内容如下:

$ cat myfifo

fghijklmnopqr /* a~e的5个字符已经被消费,就

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top