操作系统-实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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