操作系统综合实验(一)——系统调用基础
一、 实验题目
在 2.3 节中,我们描述了一个将一个文件的内容复制到目标文件的程序。该程序首先提示用户输入源文件和目标文件的名称。使用 Windows 或 POSIX API 编写此程序。请务必包括所有必要的错误检查,包括确保源文件是否存在。
正确设计和测试程序后,如果你使用支持它的系统,请使用跟踪系统调用的实用程序运行该程序。 Linux 系统提供 strace 实用程序,Solaris 和 Mac OS X 系统使用 dtrace 命令。由于 Windows 系统不提供此类功能,您将不得不使用调试器跟踪此程序的 Windows 版本。
二、 相关原理与知识
- c语言编写与编译
在Linux命令行中使用gcc对cp.c源程序进行编译。 - c语言文件读取与写入操作
使用fopen( )函数来创建一个新的文件或者打开一个已有的文件,使用fclose( )函数关闭已打开的文件,使用fread( )函数读取文件内容,使用fwrite( )函数写入内容到文件。 - Linux系统跟踪工具strace
strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。三、 实验过程
(1) 源程序编写
1. 向用户询问输入文件和输出文件的名称
2. 打开输入文件并确保源文件存在且正确打开
3. 检查输出文件是否已经存在
4. 创建或覆盖输出文件
5. 从输入文件读取数据并写入输出文件
6. 关闭文件
(2) 编译源程序并运行
(3) 通过strace程序追踪系统调用四、 实验结果与分析
(1) 程序正常运行
(2) 输出文件已存在
(3) 源文件不存在
(4) 追踪程序运行时系统调用
相应步骤的系统调用程序记录保存在对应的txt文件中。
五、 问题总结
在实验过程中,对程序系统调用追踪不了解。通过查阅相关文献和教程,学习和掌握了Linux系统下strace程序的使用,完成了实验相关要求。六、 源代码
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
int main() {
char input_file_name[100];
char output_file_name[100];
FILE *input_file, *output_file;
char buffer[BUFFER_SIZE];
size_t bytes_read;
// 向用户询问输入文件和输出文件的名称
printf("请输入输入文件的名称: ");
scanf("%s", input_file_name);
printf("请输入输出文件的名称: ");
scanf("%s", output_file_name);
// 打开输入文件
input_file = fopen(input_file_name, "r");
if (input_file == NULL) {
perror("无法打开输入文件");
return 1;
}
// 检查输出文件是否已经存在
output_file = fopen(output_file_name, "r");
if (output_file != NULL) {
fclose(output_file);
char choice;
printf("输出文件已经存在。是否要替换它? (y/n): ");
scanf(" %c", &choice);
if (choice != 'y' && choice != 'Y') {
fclose(input_file);
printf("程序中止。\n");
return 1;
}
}
// 创建或覆盖输出文件
output_file = fopen(output_file_name, "w");
if (output_file == NULL) {
perror("无法创建输出文件");
fclose(input_file);
return 1;
}
// 从输入文件读取数据并写入输出文件
while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, input_file)) > 0) {
if (fwrite(buffer, 1, bytes_read, output_file) != bytes_read) {
perror("写入输出文件时出错");
fclose(input_file);
fclose(output_file);
return 1;
}
}
// 关闭文件
fclose(input_file);
fclose(output_file);
printf("文件复制成功。\n");
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 just.ok的个人博客!





