操作系统原理实验报告(系统调用基础)

1. 实验题目

操作系统原理实验报告(系统调用基础)_第1张图片
编写实现将一个文件内容复制到目标文件的程序,程序首先提示用户输入源文件和目标文件名,使用Windows或POSIX API编写该程序,要求包含必要的错误检查,包括确保源文件存在。
正确设计并测试程序后,使用可以跟踪系统调用的实用程序来运行该程序。Linux系统提供strace程序,Solaris 和 Mac OS X系统使用dtrace命令,Windows使用Windows版本的调试器跟踪该程序。

2. 相关原理与知识

2.1 文件指针

文件指针是指向一个FILE的结构体,这个结构体里包括一个文件描述(在Windows下也被称为文件句柄)和一个I/O缓冲区。文件描述符用于C标准的IO库调用中,用于标识文件。FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,使用fp获得fp中所包含文件描述符fd的信息。

2.2 strace

用来跟踪进程执行时的系统调用和所接收的信号。在Linux中,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。通过使用strace ./1_1来执行对程序1_1系统调用的追踪。

2.3 feof()

检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0。

2.4 文件打开与关闭

(1)fopen()函数用于打开文件, 其调用格式为:*fopen( *filename, *type);第一个形式参数表示文件名, 可以包含路径和文件名两部分;第二个形式参数表示打开文件的类型。
(2)fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为:fclose(FILE *stream);该函数返回一个整型数。当文件关闭成功时, 返回0,否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

2.5 文件读写

fwrite()和fread()是以记录为单位的I/O函数,一般用于二进制文件的输入输出。

3. 实验过程

编辑原文件,为被复制对象
在这里插入图片描述
原文件内容如下
操作系统原理实验报告(系统调用基础)_第2张图片
执行程序,目标文件为copy.txt,文件内容复制成功
操作系统原理实验报告(系统调用基础)_第3张图片
打开目标文件查看其内容
在这里插入图片描述
与原文件内容一致,复制成功
操作系统原理实验报告(系统调用基础)_第4张图片
调用strace对该程序执行中使用的系统调用进行跟踪
在这里插入图片描述

4. 实验结果与分析

操作系统原理实验报告(系统调用基础)_第5张图片
复制成功,将原文件ori.txt内容复制至copy.txt中。
使用strace后,系统调用如下
操作系统原理实验报告(系统调用基础)_第6张图片
操作系统原理实验报告(系统调用基础)_第7张图片

5. 问题总结

(1) 问题:对于文件指针以及与文件操作有关的函数理解不够
解决办法:通过查阅资料,认真研读相关函数参数学习巩固函数的使用,通过阅读例子,进一步加深对函数的理解,从而正确使用。
(2)问题:不会使用strace
解决办法:通过查阅资料,研读例子,学习使用strace命令追踪程序中使用的系统调用并显示,通过该命令,学习到了文件复制程序中所使用的系统调用,对于程序以及系统调用都有了更深的理解。

6. 源代码

#include
int copy(char *ori_name,char *obj_name)
{
	FILE *in = NULL;
	FILE *out = NULL;
	char data;
	if((in = fopen(ori_name,"rb")) == NULL)
	{
		printf("Failed open\n!");
		return (1);
	}
	if ((out = fopen(obj_name,"wb+")) == NULL)
	{
		printf("Failed creat!\n");
		fclose(in);
		return (1);
	}

	while(!feof(in))
	{
		if(1== fread(&data,sizeof(char),1,in))
		  fwrite(&data,sizeof(char),1,out);
	}
	fclose(in);
	fclose(out);
	return (0);
}

int main(void)
{
	char ori_name[200];
	char obj_name[200];
	printf("Please input the file name to copy:");
	scanf("%s",ori_name);
	printf("Please input the object name:");
	scanf("%s",obj_name);

	if(copy(ori_name,obj_name))
	{
		printf("Failed copy!\n");
	}	  
	else 
	{
		printf("Successed copy!\n");
	}
	return 0;
}

你可能感兴趣的:(操作系统实验,linux,服务器)