操作系统-实验三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统-实验三

文件系统的用户界面

一、实验目的

进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。

二、实验题目

1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序(文件大小>1M ),文件可以编一个C 程序来生成,或使用/usr/bin下的二进制执行文件。

调用格式例如:

copy file1 file2

#include

main(int argc, char*argv[])

{ …

fd1=open(argv[1], O_RDONLY); //系统调用

creat (argv[2], 0660);

fd2=open(argv[2], O_WRONL Y);

while((n=read(fd1, buf, BUFSIZE))>0)

write(fd2, buf, n);

main带参的调用方法例(含测试时间):

time ./mycp infile outfile

流文件的实验程序请参考该程序完成。

上述函数中nbytes, size和nitems都取值为1时(即一次读写一个字节),比较系统调用和流文件两种程序的执行效率。当nbytes取4096字节,size取1字节且nitems取4096时(即一次读写4096字节),再次比较这两种程序的执行效率(文件大小>1M)。如:

创建大文件的方法之一,比如用creat 创建一个新文件,用open写打开该文件,用lseek将写指针移到很远处,写入随便一个字符。比如移动0x100000,用write写个“1”,就会得到一个1M大小的文件。也可到Linux的/usr/bin找一个1~3M左右的大的执行文件。

对于单独使用的速度较快的计算机,文件要10M~100M。

2.编写一个父子进程之间用无名管道进行数据传送的C程序。父进程逐一读出一个文件的内容,并通过管道发送给子进程。子进程从管道中读出信息,再将其写入一个新的文件。程序结束后,对原文件和新文件的内容进行比较。

3.在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。

三、源代码

1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序。

程序一

#define BUFSIZE 4096

#include

#include

#include

#include

int main(int argc, char *argv[])

{

printf("这个是一次4096个字节的运行结果:\n");

int inputFd, outputFd, n, mode;

char buf[BUFSIZE];

inputFd = open(argv[1],O_RDWR|O_CREAT, 0777);

outputFd = open(argv[2],O_WRONL Y|O_CREAT, 0777);

char str[20] = "My name is LXC";

lseek(inputFd, 1000000, 0);

write(inputFd, str, strlen(str));

lseek(inputFd, 0, 0);

while((n=read(inputFd, buf, BUFSIZE))>0)

write(outputFd,buf, n);

close(inputFd);

close(outputFd);

return 0;

}

以下为输出结果:

xc@ubuntu:~$ time ./copy InputData OutputData

这个是一次一个字节的运行结果:

real 0m1.597s

user 0m0.064s

sys 0m1.500s

lxc@ubuntu:~$ gcc CopyFile.c -o copy

lxc@ubuntu:~$ time ./copy InputData OutputData

这个是一次4096个字节的运行结果:

real 0m0.002s

user 0m0.000s

sys 0m0.000s

lxc@ubuntu:~$

程序二

#define BUF_SIZE 1

#include

#include

int main(int grgc, char *argv[])

{

printf("这个是一次读取1个字节");

FILE *inputFp,* outputFp;

inputFp = fopen(argv[1],"r+");

outputFp = fopen(argv[2],"w+");

char BUF[BUF_SIZE];

while (!feof(inputFp))

{

fread(BUF, BUF_SIZE, 1, inputFp);

fwrite(BUF, BUF_SIZE, 1, outputFp);

fgetc(inputFp);

}

fclose(inputFp);

fclose(outputFp);

}

以下为输出结果

lxc@ubuntu:~$ gcc CopyFileV2.c -o copy

lxc@ubuntu:~$ time ./copy InputData OutPutData 这个是一次读取4096个字节

real 0m0.004s

user 0m0.000s

sys 0m0.000s

lxc@ubuntu:~$ gcc CopyFileV2.c -o copy

lxc@ubuntu:~$ time ./copy InputData OutPutData 这个是一次读取1个字节

real 0m0.038s

相关文档
最新文档