操作系统课程设计指导书文档格式.docx

上传人:b****7 文档编号:22899992 上传时间:2023-02-05 格式:DOCX 页数:106 大小:122.62KB
下载 相关 举报
操作系统课程设计指导书文档格式.docx_第1页
第1页 / 共106页
操作系统课程设计指导书文档格式.docx_第2页
第2页 / 共106页
操作系统课程设计指导书文档格式.docx_第3页
第3页 / 共106页
操作系统课程设计指导书文档格式.docx_第4页
第4页 / 共106页
操作系统课程设计指导书文档格式.docx_第5页
第5页 / 共106页
点击查看更多>>
下载资源
资源描述

操作系统课程设计指导书文档格式.docx

《操作系统课程设计指导书文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计指导书文档格式.docx(106页珍藏版)》请在冰豆网上搜索。

操作系统课程设计指导书文档格式.docx

该系统调用返回的描述符,失败则返回-1;

flag:

本身由操作允许权和控制命令值相“或”得到。

如:

IPC_CREAT|0400是否该队列应被创建;

IPC_EXCL|0400是否该队列的创建映是互斥的等。

4.msgsnd(id,msgp,size,flag)

发送一消息

头文件;

syy/types.h>

sys/msg.h>

intmsgsnd(id,msgp,size,flag);

intid,size,flag;

structmsgbuf*msgp;

其中:

id:

返回消息队列的描述符;

msgp:

指向用户存储区的一个构造体指针;

size:

指示由msgp指向的数据结构中字符数组的长度,即消息的长度。

这个数组的最大值由MSG_MAX系统可调用参数来确定。

规定当核心用尽内部缓冲空间时应执行的动作;

若在标志flag中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd进程睡眠。

若是设置IPC_N0WAIT,则在此情况下,msgsnd立即返回。

5.msgrcv(id,msgp,size,type,flag)

接受一消息

intmsgrcv(id,msgp,size,type,flag)

intid,size,type,flag;

structmsgbuf*msgq;

structmsgbuf{longmtypescharmtext[];

};

count=msgrcv(id,msgp,size,type,flag);

消息描述符;

用来存放欲接收消息的拥护数据结构的地址;

msgp中数据数组的大小;

type:

用户要读的消息类型:

type=0:

接收该队列的第一个消息;

type>

0:

接收类型type的第一个消息;

type<

接收小于或等于type绝对值的最低类型的第一个消息。

规定倘若该队列无消息,核心应当做什么事,如果此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MSG_NOERROR,且所接收的消息大小大于size,核心截断所接受的消息。

count:

返回消息正文的字节数。

6.msgctl(id,cmd,buf)

查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。

sys/tyes.h>

intmsgctl(id,cmd,buf)

intid,cmd;

structmsqiq_ds*buf;

函数调用成功时返回0,调用不成功时返回-1。

用来识别该消息的描述符;

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)

获得一个共享存储区

sys/shm.h>

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)

从逻辑上将一个共享存储区附接到进程的虚拟地址空间。

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)

把一个共享存储区从指定进程的虚地址空间断开。

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);

structshmid_ds*buf;

调用成功时返回0,否则返回-1。

Id:

为被共享存储区的标识符;

Cmd:

规定操作的类型。

规定如下:

返回包含在指定的shmid相关数据结构中的状态信息,并且把它放置在用户存储区中的*buf指针所指的数据结构中。

执行此命令的进程必须有读取允许权。

对于指定的shmid,为它设置有效用户和小组标识和操作存取权。

删除指定的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)

允许调用进程控制软中断信号的处理。

signal.h>

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。

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可以打开或创建一个文件,并返回一个文件描述符。

调用方法:

sys/stat.h>

fcntl.h>

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

功能:

创建一个新文件

intcreat(constchar*pathname,mode_tmode);

返回:

成功为只写打开的文件描述符;

出错为-1。

注意:

此函数等效于:

open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);

read

从描述符为filedes的文件读信息。

ssize_tread(intfiledes,void*buff,size_tnbytes);

读到的字节数,若已到文件尾为0,若出错为-1。

在UNIX/Linux可重定义为:

intread(intfd,char*buff,unsignednbytes);

write

向已打开的文件写数据。

ssize_twrite(intfiledes,constvoid*buff,size_tnbytes);

若成功为已写入的字节数;

intwrite(intfd,char*buff,unsignednbytes);

文件位置指针

文件位置指针:

每个打开文件都有一个与其相关联的“当前位移量”。

是从文件开始处计算的字节数。

通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。

按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。

文件位置指针可以通过系统调用lseek来移动。

lseek

显式地定位一个打开文件的位置指针。

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

控制和改变已经打开文件的属性。

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。

stdio.h>

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:

确定文件位置。

longftell(FILE*fp);

若成功则为当前文件位置指示,若出错则为-1L

2.系统调用:

fseek:

intfseek(FILE*fp,longoffset,intwhence);

若成功则为0,若出错则为非0(-1)。

3.系统调用:

fgetpos,fsetpos

获得或设置文件位置。

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)进程通信:

①软中断通信;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1