当前位置:文档之家› 操作系统-实验三

操作系统-实验三

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

二、实验题目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 <fcntl.h>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 <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>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.597suser 0m0.064ssys 0m1.500slxc@ubuntu:~$ gcc CopyFile.c -o copylxc@ubuntu:~$ time ./copy InputData OutputData这个是一次4096个字节的运行结果:real 0m0.002suser 0m0.000ssys 0m0.000slxc@ubuntu:~$程序二#define BUF_SIZE 1#include <stdio.h>#include <stdlib.h>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 copylxc@ubuntu:~$ time ./copy InputData OutPutData 这个是一次读取4096个字节real 0m0.004suser 0m0.000ssys 0m0.000slxc@ubuntu:~$ gcc CopyFileV2.c -o copylxc@ubuntu:~$ time ./copy InputData OutPutData 这个是一次读取1个字节real 0m0.038suser 0m0.032ssys 0m0.000slxc@ubuntu:~$2、编写一个父子进程之间用无名管道进行数据传送的C程序。

父进程逐一读出一个文件的内容,并通过管道发送给子进程。

子进程从管道中读出信息,再将其写入一个新的文件。

程序结束后,对原文件和新文件的内容进行比较。

程序#define BUFF_SIZE 1024#include <stdio.h>#include <string.h>#include <fcntl.h>int main(int argc, char *argv[]){int sfd, dfd, n, chan[2];char buff[BUFF_SIZE];sfd = open("InputData", O_RDONLY, 0644);dfd = open("OutputData", O_WRONL Y|O_CREAT|O_TRUNC, 0644);pipe(chan);if(fork()){close(chan[0]);while((n = read(sfd, buff, BUFF_SIZE))>0){write(chan[1], buff, n);}close(chan[1]);}else{close(chan[1]);read(chan[0], buff, BUFF_SIZE);write(dfd, buff, strlen(buff));close(chan[0]);}close(sfd);close(dfd);return 0;}以下为输出结果:3、在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。

程序:写管道端#define BUFSIZE 256#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>#include <string.h>int main(int argc, const char *argv[]){int writeFifoFd, inputDataFd, n;char buf[BUFSIZE];mknod("fifo",S_IFIFO|0666,0);writeFifoFd = open("fifo",O_WRONLY);inputDataFd = open("InputData.txt",O_RDONLY);while((n=read(inputDataFd, buf, BUFSIZE))>0)write(writeFifoFd,buf,n);close(inputDataFd);close(writeFifoFd);return 0;}读管道端#define BUFSIZE 256#include<fcntl.h>int main(int argc, const char *argv[]){int readFifoFd, outputDataFd, n;char buf[BUFSIZE];readFifoFd = open("fifo",O_RDONLY);outputDataFd = open("OutputData.txt", O_CREAT|O_WRONLY, 0644);while((n = read(readFifoFd, buf, sizeof(buf)))!=0)write(outputDataFd,buf,n);close(readFifoFd);close(outputDataFd);return 0;}运行结果Unix实用程序一、实验目的熟悉和掌握Unix的shell命令,正则表达式和过滤器程序的使用。

二、实验题目1.上机练习ls,ln,ln –s,file,chown,chmode,head,taill,find等命令。

1)假定当前目录中没有ls.save文件,先后键入ls –l和ls –l > ls.save两个命令。

相关主题