操作系统实验上机

实验名称 CopyFile 实验序号 1
实验日期 公元2077年 实验人 rytter

一、实验题目

image-20220409145921276

二、相关原理和知识

  1. 在终端中利用vim编写C程序,利用gcc对编写的C程序进行编译
  2. 用C语言中的函数进行打开关闭复制文件等操作
  3. 用linux中strace语言进行跟踪系统调用

三、实验过程

  1. 利用vim进行编写C程序,利用命令行获取参数,并查询是否存在文件,进行相应的覆盖或停止操作。
  2. 利用fopen()等函数进行复制操作
  3. 利用strace进行跟踪,查看系统调用

四、实验结果与分析

image-20220409151123149

image-20220409151217713

五、问题总结

  1. 命令行输入后,strace和不用strace得到的命令数据是不太一样的,不用strace时第一个文件名在2号位上
  2. 关于名称冲突的错误分析,应该把源文件名冲突判断放在第一个,不然会出现先选择是否覆盖然后提示目标文件名冲突,会比较奇怪。

六、源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

int main(int argc,char** argv) {
FILE* file1= fopen(argv[argc-2], "rb");
if(file1==NULL){
printf("Error!Can't find file: %s \n", argv[argc-2]);
return 0;
}
if(fopen(argv[argc-1],"rb")!=NULL){
printf("Warning!File %s has existed,press y to cover it!\n",argv[argc-1]);
char jundge;
getchar();
scanf("%c",&jundge);
if(jundge!='y'&&jundge!='Y') {
printf("Warning!Program has been stopped\n");
return 0;
}
}
FILE* file2= fopen(argv[argc-1],"wb");
if(file2==NULL){
printf("Error!Can't creat file: %s\n",argv[argc-1]);
return 0;
}
char buffer[1024];
int n;
while((n=fread(buffer,1,sizeof (buffer),file1))>0){
fwrite(buffer,1,n,file2);
}
return 0;
}