操作系统课程设计指导书.docx
- 文档编号:9703335
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:106
- 大小:122.62KB
操作系统课程设计指导书.docx
《操作系统课程设计指导书.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计指导书.docx(106页珍藏版)》请在冰豆网上搜索。
操作系统课程设计指导书
操作系统课程设计指导书
由于操作系统课程的学时和条件有限,在理论学习过程中没有给同学们提供实验的机会。
本课程设计的目的,是给同学提供一个集中实验的机会。
希望同学们通过该设计加深对所学习课程的基本知识和基本理论的理解。
本设计的内容是基于《操作系统原理》教材的,但还要求同学们必须对以前的《C语言程序设计》和《数据结构》等内容进行认真的复习。
课程中学到的UNIX系统调用等是我们使用的主要工具。
系统调用函数说明、参数值及定义
1.fork()
创建一个新进程。
用法:
intfork()
其中返回int取值意义如下:
0:
创建子进程,从子进程返回的id值
>0:
从父进程返回的子进程id值
-1:
创建失败
2.lockf(files,function,size)
用作锁定文件的某些段或者整个文件。
头文件:
#include
参数定义:
intlockf(files,function,size);
intfiles,function;
longsize;
其中:
files是文件描述符;function是锁定和解锁;1表示锁定;0表示解锁;Size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。
3.msgget(key,flag)
获得一个消息的描述符
头文件:
#include
#include
#include
参数定义:
intmsgget(key,flag)
key_tkey
intflag;
语法格式:
msgqid=msgget(key,flag);
其中:
msgqid:
该系统调用返回的描述符,失败则返回-1;
flag:
本身由操作允许权和控制命令值相“或”得到。
如:
IPC_CREAT|0400是否该队列应被创建;
IPC_EXCL|0400是否该队列的创建映是互斥的等。
4.msgsnd(id,msgp,size,flag)
发送一消息
头文件;
#include
#include
#include
参数定义:
intmsgsnd(id,msgp,size,flag);
intid,size,flag;
structmsgbuf*msgp;
其中:
id:
返回消息队列的描述符;
msgp:
指向用户存储区的一个构造体指针;
size:
指示由msgp指向的数据结构中字符数组的长度,即消息的长度。
这个数组的最大值由MSG_MAX系统可调用参数来确定。
flag:
规定当核心用尽内部缓冲空间时应执行的动作;若在标志flag中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd进程睡眠。
若是设置IPC_N0WAIT,则在此情况下,msgsnd立即返回。
5.msgrcv(id,msgp,size,type,flag)
接受一消息
头文件:
#include
#include
#include
参数定义:
intmsgrcv(id,msgp,size,type,flag)
intid,size,type,flag;
structmsgbuf*msgq;
structmsgbuf{longmtypescharmtext[];};
语法格式:
count=msgrcv(id,msgp,size,type,flag);
其中:
id:
消息描述符;
msgp:
用来存放欲接收消息的拥护数据结构的地址;
size:
msgp中数据数组的大小;
type:
用户要读的消息类型:
type=0:
接收该队列的第一个消息;
type>0:
接收类型type的第一个消息;
type<0:
接收小于或等于type绝对值的最低类型的第一个消息。
flag:
规定倘若该队列无消息,核心应当做什么事,如果此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MSG_NOERROR,且所接收的消息大小大于size,核心截断所接受的消息。
count:
返回消息正文的字节数。
6.msgctl(id,cmd,buf)
查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。
头文件:
#include
#include
#include
参数定义:
intmsgctl(id,cmd,buf)
intid,cmd;
structmsqiq_ds*buf;
其中:
函数调用成功时返回0,调用不成功时返回-1。
id:
用来识别该消息的描述符;
cmd:
规定命令的类型。
IPC_STAT:
将与id相关联的消息队列首标读入buf。
IPC_SET:
为这个消息序列设置有效的用户和小组标识及操作允许权和字节的数量。
IPC_RMID:
删除id的消息队列。
buf:
是含有控制参数或查询结果的用户数据结构的地址。
附:
msgid_ds结构定义如下:
structmsgid_ds{
structipc_permmsg_perm;//许可权结构
shortpad1[7];//由系统使用
ushortonsg_qnum;//队列上消息数
ushortmsg_qbytes;//队列上最大字节数
ushortmsg_lspid;//最后发送消息的PID
ushortmsg_lrpid;//最后接收消息的PID
time_tmsg_stime;//最后发送消息的时间
time_tmsg_rtime;//最后接收消息的时间
time_tmsg_ctime;//最后更改时间
}
structipc_perm{
ushortuid;//当前进程用户id
ushortgid;//当前进程组id
ushortcuid;//创建用户id
ushortcgid;//创建进程组id
ushortmode;//存取许可权
{shortpad1;longpad2;}//由系统使用
};
7.shmget(key,size,flag)
获得一个共享存储区
头文件:
#include
#include
#include
语法格式:
shmid=shmget(key,size,flag);
参数定义
intshmget(key,size,flag);
key_tkey;
intsize,flag;
其中:
size是存储区的字节数,key和flag与系统调用msgget中的参数含义相同。
附:
操作允许权
八进制数
用户可读
00400
用户可写
00200
组可读
00040
组可写
00020
其他人可读
00004
其他人可写
00002
控制命令
控制命令
值
RPC_CREAT
0001000
IPC_EXCL
0002000
如:
shmid=shmget(key,size,(IPC_CREAT|0400));
创建一个关键字为key,长度为size的共享存储区。
8.shmat(id,addr,flag)
从逻辑上将一个共享存储区附接到进程的虚拟地址空间。
头文件:
#include
#include
#include
参数定义
char*shmat(id,addr,flag);
intid,flag;
char*addr;
语法格式:
virtaddr=shmat(id,addr,flag);
其中:
id:
共享存储区的标识符;
addr:
用户要使用共享存储区附接的虚地址,若addr是0,系统选择一个适当的地址来附接该共享区;
flag:
规定对此区的读写权限,以及系统是否应对用户规定的地址做舍入操作,如果flag中设置了shm_rnd即表示操作系统在必要时舍去这个地址。
如果设置了shm_rdonly,即表示只允许读操作;
viraddr是附接的虚地址。
9.shmdt(addr)
把一个共享存储区从指定进程的虚地址空间断开。
头文件:
#include
#include
#include
参数定义
intshmdt(addr)
char*addr
其中,当调用成功时,返回0值,调用不成功返回-1;addr是系统调用shmat所返回的的地址。
10.shmctl(id,cmd,buf)
对与共享存储区关联的各种参数进行操作,从而对共享存储区进行控制。
头文件:
#include(sys/types.h)
#include(sys/ipc.h)
#include(sys/shm.h)
参数定义:
intshmct1(id,cmd,buf);
intid,cmd;
structshmid_ds*buf;
其中:
调用成功时返回0,否则返回-1。
Id:
为被共享存储区的标识符;
Cmd:
规定操作的类型。
规定如下:
IPC_STAT:
返回包含在指定的shmid相关数据结构中的状态信息,并且把它放置在用户存储区中的*buf指针所指的数据结构中。
执行此命令的进程必须有读取允许权。
IPC_SET:
对于指定的shmid,为它设置有效用户和小组标识和操作存取权。
IPC_RMID:
删除指定的shmid以及与它相关的共享存储区的数据结构。
SHM_LOCK:
在内存中锁定指定的共享存储区,必须是超级用户才可以进行此项操作。
Buf:
是一个用户级数据结构地址。
附:
shmid_ds{
structipc_permshm_perm;//许可权结构
intshm_segsz;//段大小
intpad1;//由系统使用
ushortshm_lpid;//最后操作的进程id
ushortchm_cpid;//创建者的进程id
ushortshm_nattch;//当前附接数
ushortpad2;//由系统使用;
time_tshm_atime;//最后附接时间
time_tshm_dtime;//最后断接时间
time_tshm_ctime;//最后修改时间
}
11.signal(sig,function)
允许调用进程控制软中断信号的处理。
头文件:
#include
参数定义
signal(sig,function)
intsig;
void(*function)();
返回值:
成功时返回旧的(以前)函数描述,失败时返回SIG_ERR。
说明:
信号sig的值在头文件singal.h中有完整定义和描述,可用man7signal来获得帮助。
其中:
sig的值是:
SIGHUP挂起
SIGINT键盘按delete键或break键
SIGQUIT键盘按quit键
SIGILL非法指令
SIGIOTI0T指令
SIGEMTEMT指令
SIGFPE浮点运算溢出
SIGKILL要求终止进程
SIGBUS总线错
SIGSEGV段违例
SIGSYS系统调用参数错
SIGPIPE向无读者管道上写
SIGALRM闹钟
SIGTERM软件终结
SIGUSR1第一个用户定义信号
SIGUSR2第二个用户定义信号
SIGCLD子进程死
SIGPWR电源故障
function的解释如下:
SIG_DFL:
缺省操作。
对除SIGPWR和SIGCLD外所有信号的缺省操作是进程终止。
对信号SIGQUIT,SIGILL,SIGTRAP,SIGIOT,SIGEMT,SIGFPE,SIGBUS,SIGSEGV和SIGSYS它产生一内存映像文件。
SIG_IGN:
忽视该信号的出现。
function:
在该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGILL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。
12.kill(pid,sig)
向pid为进程号的进程发送信号sig。
头文件:
#include
#include
参数定义
intkill(pid_tpid,intsig)
pid_tpid:
信号的接收进程。
(pid_t可用整数代替。
)
若pid>0,则pid为接收者的进程号,若pid=0,则接收者为同组的所有进程。
若pid=-1则发送到除init进程外的所有进程。
若pid<-1,则接收者为-pid进程组中的每个进程。
intsig:
发送的信号。
返回值:
若成功返回0,否则为-1.当出错时,errno将被设置为合适的错误代码。
open
open可以打开或创建一个文件,并返回一个文件描述符。
调用方法:
#include
#include
#include
intopen(constchar*pathname,intoflag);
intopen(constchar*pathname,intoflag,mode_tmode);
返回值:
成功时为文件描述符,出错则为-1。
open的参数
pathname是要打开或创建的文件的名字。
oflag参数可用来说明此函数的多个选择项。
用下列一个或多个常数进行或运算构成oflag参数(在fcntl.h中):
•O_RDONLY:
只读打开。
•O_WRONLY:
只写打开。
•O_RDWR:
读写打开•O_APPEND追加方式。
•O_CREAT若不存在则创建它。
需同时使用第三个参数mode。
•O_EXCL如果同时指定了O_CREAT,而文件已经存在,则出错。
这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
•O_TRUNC如果此文件存在,则将其长度截短为0。
•O_NOCTTY如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
•O_NONBLOCK如果pathname指的是特殊文件,此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
creat
功能:
创建一个新文件
用法:
#include
#include
#include
intcreat(constchar*pathname,mode_tmode);
返回:
成功为只写打开的文件描述符;出错为-1。
注意:
此函数等效于:
open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);
read
功能:
从描述符为filedes的文件读信息。
用法:
#include
ssize_tread(intfiledes,void*buff,size_tnbytes);
返回:
读到的字节数,若已到文件尾为0,若出错为-1。
在UNIX/Linux可重定义为:
intread(intfd,char*buff,unsignednbytes);
write
功能:
向已打开的文件写数据。
用法:
#include
ssize_twrite(intfiledes,constvoid*buff,size_tnbytes);
返回值:
若成功为已写入的字节数;出错为-1。
intwrite(intfd,char*buff,unsignednbytes);
文件位置指针
文件位置指针:
每个打开文件都有一个与其相关联的“当前位移量”。
是从文件开始处计算的字节数。
通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。
按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。
文件位置指针可以通过系统调用lseek来移动。
lseek
功能:
显式地定位一个打开文件的位置指针。
用法:
#include
#include
off_tlseek(intfiledes,off_toffset,intwhence);
返回值:
若成功为新的文件位移,若出错为-1。
说明:
对参数offset的解释与参数whence的值有关:
whence=SEEK_SET(0),从文件开始。
whence=SEEK_CUR
(1),从当前位置,offset可正可负。
whence=SEEK_END
(2),从文件末尾,offset可为正或负。
例:
求文件的当前位置指针:
off_tcurrpos;currpos=lseek(fd,0,SEEK_CUR);
这种方法也可用来确定所涉及的文件是否可以设置位移量。
如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE。
fcntl
功能:
控制和改变已经打开文件的属性。
用法:
#include
#include
#include
intfcntl(intfiledes,intcmd,longarg);
intfcntl(intfiledes,intcmd,structflock*lock);
返回值:
若成功则依赖于cmd(见下),若出错为-1
fcntl函数有五种功能
•复制一个现存的描述符(cmd=F_DUPFD),新文件描述符作为函数值返回。
它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值。
新描述符与filedes共享同一文件表项;
•获得/设置文件描述符标记(cmd=F_GETFD/F_SETFD);对应于filedes的文件描述符标志作为函数值返回。
•获得/设置文件状态标志(cmd=F_GETFL/F_SETFL);新标志值按第三个参数设置。
可以更改的几个标志是:
O_APPEND,O_NONBLOCK,O_SYNC和O_ASYNC。
•获得/设置异步I/O有权(cmd=F_GETOWN/F_SETOWN);获取或接收当前接收SIGIO和SIGURG信号的进程ID或进程组ID。
•获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)。
ioctl函数
ioctl函数是I/O操作的杂物箱。
不能用本章中其他函数表示的I/O操作通常都能用ioctl表示。
终端I/O是ioctl的最大使用方面(第11章将介绍POSIX.1已经用新的函数代替ioctl进行终端I/O操作)。
Ioctl更多的是用于设备控制,比如磁盘的格式化,MODEM设备,磁带的快进、快倒等。
文件高级I/O中的二进制I/O及定位
字符I/O只能用于文本文件,而对于二进制文件则会出错。
对于二进制文件必须使用二进制I/O。
二进制I/O
系统调用:
fread,fwrite
功能:
以二进制方式进行I/O。
用法:
#include
size_tfread(void*ptr,size_tsize,size_tnobj,FILE*fp);
size_tfwrite(constvoid*ptr,size_tsize,size_tnobj,FILE*fp);
返回:
读或写的对象个数。
流定位
有两种方法定位标准I/O流。
(1)ftell和fseek。
这两个函数自SYSV7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中。
(2)fgetpos和fsetpos。
这两个函数是新由ANSIC引入的。
它们引进了一个新的抽象数据类型fpos_t,它记录文件的位置。
在非UNIX系统中,这种数据类型可以定义为记录一个文件的位置所需的长度。
需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos。
流定位,可参照系统调用lseek()。
1.系统调用:
ftell:
功能:
确定文件位置。
用法:
#include
longftell(FILE*fp);
返回:
若成功则为当前文件位置指示,若出错则为-1L
2.系统调用:
fseek:
用法:
intfseek(FILE*fp,longoffset,intwhence);
返回值:
若成功则为0,若出错则为非0(-1)。
3.系统调用:
fgetpos,fsetpos
功能:
获得或设置文件位置。
用法:
#include
intfgetpos(FILE*fp,fpos_t*pos);
intfsetpos(FILE*fp,constfpos_t*pos);
返回值:
若成功则为0,若出错则为非0(-1).
注:
Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。
它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。
对于学生正确理解,掌握操作系统的基本知识具有重要意义。
鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。
这就要求大家:
(1)熟悉Linux的操作和开发环境;
(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。
Linux系统的内核源代码可以从很多的网站上下载。
如果想安装Linux系统,可以利用Linux安装光盘进行安装,或从校学校的资源上下载RedHat9.2的光盘映象文件。
地址为。
虚拟机软件,也可从该网站下载。
我们的设计和实验将Windows环境下,基于虚拟机软件VMWare软件进行安装。
具体安装办法,参见虚拟机下的RedHat9.2的安装方法。
设计指导
1.图书管理系统
以UNIX系统文件部分系统调用为基础设计一个简易的图书管理系统。
要求实现:
图书的录入、查询、借阅、清理、统计等功能、还要实现对每天的借阅情况进行统计并出来统计报表。
图书查询
图书录入
图书借阅
2.信号通信与进程控制
<任务>
(l)进程的创建:
编写一段程序,使用系统调用fork()创建两个或多个子进程。
当此程序运行时,在系统中有一个父进程和其余为子进程活动。
(2)进程的控制:
在程序中使用系统调用lockf()来给每一个进程加锁,实现进程之间的互斥。
(3)进程通信:
①软中断通信;②
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 指导书