一、 课程设计目的
掌握 Linux 操作系统的使用方法;
了解 Linux 系统内核代码结构;
掌握实例操作系统的实现方法。
二、 课程设计要求
1、 掌握 Linux 操作系统的使用方法,包括键盘命令、系统调用;掌握在
Linux 下的编程环境。
编一个 C 程序,其内容为实现文件拷贝的功能;
编一个 C 程序,其内容为分窗口同时显示三个并发进程的运行结
果。要求用到 Linux 下的图形库。
2、 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调
用。另编写一个应用程序,调用新增加的系统调用。
实现的功能是:文件拷贝;
3、 掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱
动程序,其功能可以简单。
实现字符设备的驱动;
4、 了解和掌握/proc 文件系统的特点和使用方法
了解/proc 文件的特点和使用方法
监控系统状态,显示系统中若干部件使用情况
用图形界面实现系统监控状态。
5、 设计并实现一个模拟的文件系统(选作)
三、 课程设计系统平台
实体硬件
CPU
AMD Athlon™ 7750 Dual-Core Processor 2.7GHz
主板
Asus M3A78
内存
4.0GB(3.25GB 可用)
操作系统
Windows 7 下的虚拟机 VMware Workstation 6.0
虚拟系统 ubuntu-10.10-i386
内核版本
Linux-2.6.37.4
虚拟硬件
内存
1GB
硬盘
16GB
四、 课程设计内容一
1、 编一个 C 程序,其内容为实现文件拷贝的功能
要实现文件拷贝功能,主要用到的函数是 open、write、read。
以前在 windows 下写 C 语言打开文件常用的 fopen,此时不能用,因
为 fopen 是 ANSIC 标准中的 C 语言库函数,在不同的系统中应该调用不
同的内核 api ;所以应该直接使用 linux 中的系统函数 open。
主要用到的头文件:
Unistd.h \\包含了许多 Linux 系统服务的函数原型,如:read、write
Fcntl.h \\定义了很多宏和 open,fcntl 函数原型
Stdio.h \\标准输入输出头文件
sys/types.h \\此头文件包含适当时应使用的多个基本派生类型
sys/stat.h \\包含了获取文件属性的一些函数
errno.h \\用于调试错误代码是所需要的一些 errno 变量
string.h \\包含了处理字符串的一些函数
设计思路:由命令行参数获取 2 个文件名,根据其文件名和路径分别打
开该 2 个文件,设置一个循环,从源文件复制 N 个字节到目的文件,直到源
文件指针到文件尾,最后关闭 2 个文件。
在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,
以方便调试或是往后应用在第 2 小题中可能发生的错误。
理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码
scopy.c ;在 Linux 终端使用编译命令 gcc –o scopy scopy.c 将程序编译并
生产 exe 可执行文件。
然后手动创建一个测试文件 test.txt ,在终端输入命令
./scopy test.txt target.txt
这样就能将源文件 test.txt 复制到目标文件 target.txt
程序源代码 scopy.c:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#define BUFFER_SIZE 1024 //缓冲区大小
int main(int argc,char **argv)
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE]; //设定一个缓冲区
char *ptr;
if(argc!=3) //三个参数
{
fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);
return(-1);
}
/* 打开源文件 */
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));
return(-1);
}
/* 创建目的文件 */
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));
return(-1);
}
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
return(1);
}
2、 编一个 C 程序,其内容为分窗口同时显示三个并发进程的运行结果。要
求用到 Linux 下的图形库。
本次我选用的图形库是 GTK+
首先要在 Linux 下载 GTK+相关库文件并安装。
在终端输入 sudo apt-get install gnome-core-devel ,然后根据提示操作,
就会安装 libgtk2.0-dev libglib2.0-dev 等开发所需的相关库文件。
编译 GTK+代码时需要包含的头文件是 gtk/gtk.h,此外,还必须连接
若干库;比如编译 test.c 时用以下命令。
gcc –o test test.c `pkg-config --cflags --libs gtk+-2.0`
在编写代码时需要用到的控件、窗口等视窗物件形态,用类 GtkWidget
定义其为指针类型。
编写一个 GTK+程序的基本步骤如下:
初始化 Gtk
建立控件
登记消息与消息处理函数
执行消息循环函数 gtk_main()
之后所设计的 3 个进程,基本上都是以这样的方式编写代码的,因为
之前曾用过 OpenGL,所以在这方面掌握的比较快。
初始化主要使用的函数有
gtk_init(&argc,&argv); //启动 GTK
gtk_window_new(GTK_WINDOW_TOPLEVEL); //创建窗口
gtk_window_set_title(GTK_WINDOW(window),"标题名"); //设置窗口标题名