第一范文网 - 专业文章范例文档资料分享平台

操作系统实验指导书

来源:用户分享 时间:2025/7/23 22:49:23 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

(2) pid=0时,核心将信号发送给与发送进程同个进程组的所有进程。 (3) pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户

标识号的进程。

signal( )

预置对信号的处理方式,允许调用进程控制软中断信号。 系统调用格式 signal(sig,function)

头文件为:#include 参数定义 signal(sig,function)

参数:int sig; void (*func) ( )

signal() 会依参数sig指定的信号编号来设置该信号的处理函数。当指定信号到达时就会跳转到参数function指定的函数执行。

其中sig用于指定信号的类型,sig为0则表示没有收到任何信号,如下表:

值 01 02 03 04 05 06 07 08 09 10 11 名 字 SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGIOT SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV 说 明 挂起(hangup)当终端机察觉到终止连线操作时便会传送这个信号 中断,当用户从键盘按^c键或^break键时,则会产生此信号 退出,当用户从键盘按quit键时,如CTRL+\\,则会产生此信号 非法指令(进程执行了一个不合法德CPU指令) 跟踪陷阱(trace trap),当子进程因被追踪而暂停时产生此信号给父进程 IOT指令 总线错误,BUS发生错误时会产生此信号 浮点运算溢出 杀死、终止进程的信号,此信号不能被拦截或忽略 用户自定义信号1 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置 用户自定义信号2 错误的管道;欲写入无读取端的管道时产生此信号 闹钟。当某进程希望在某时间后接收信号时发此信号 软件终止(software termination) 堆栈错误 子进程暂停或结束时便会产生此信号给父进程 此信号会让暂停的进程继续执行 此信号用来让进程暂停执行,此信号不能被拦截或忽略 当由键盘(CTRL+Z)表示暂停时就产生此信号 12 SIGUSR2 13 SIGPIPE 14 SIGALRM 15 SIGTERM 16 SIGSTKFLT 17 SIGHLD 18 SIGCONT 19 SIGSTOP 20 SIGTSTP function:该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数。function 的解释如下:

13

(1) function=1(SIG_IGN)时,进程对sig类信号不予理睬,亦即屏蔽了该类信号; (2) function=0(SIG_DFL)时,缺省值,进程在收到sig信号后应终止自己; (3) function为非0,非1类整数时,function的值即作为信号处理程序的指针。 pause( )函数

让进程暂停(进入睡眠状态)直到被信号(signal)所中断。 waitpid( ) 函数

会暂停目前进程的执行,直到有信号来到或子进程结束。 exit( )函数 终止进程的执行。 系统调用格式: void exit(status) int status;

其中,status是返回给父进程的一个整数,以备查考。为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX利用exit( )来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit( ),使子进程自我终止。exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。

如果调用进程在执行exit( )时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。核心须为exit( )完成以下操作:

(1) 关闭软中断;(2) 回收资源;(3) 写记帐信息;(4) 置进程为“僵死状态”。 四、实验步骤 1. 进程的创建

在下面程序中,使用系统调用fork()创建一个子进程。当此程序运行时,在系统中有一个父进程和一个子进程同步运行,在程序中分别获得父进程和子进程的进程号【使用系统调用getpid( )】。

#include //Unix/Linux系统的基本系统数据类型的头文件 #include //UNIX系统服务的函数原型 #include int main() {

int pid; pid=fork();

if(pid==0) //子进程 {

14

printf(\

printf(\ printf(\ }

else if(pid>0) //父进程 {

printf(\

printf(\ printf(\ }

else //创建失败 printf (\}

编译上面程序,观察父进程和子进程的PID号有何关系?如何区分父进程和子进程?getpid获得进程号和fork创建返回的PID号有何关系? 【扩展】父子进程的同步

#include #include #include #include int main() {

int pid; pid=fork(); if(pid==0) {

printf(\

printf(\ sleep(10); //子进程sleep10秒钟 printf(\ exit(0); //退出 }

else if(pid>0) {

printf(\

printf(\ wait(0); //父进程等待子进程退出 printf(\ } else

printf (\ printf(\}

对比该段程序与上一段程序的异同?如果没有父进程中的wait(0),会出现什么现象?使用ps -aux查看子进程的状态。如果将子进程中sleep系统调用改成系统调用pause( ),将什么结果?试实验之。【如果一个进程休眠,而没有进程通知将导致其一直睡眠下去。】

2. 多进程运行的结果不可重现 #include #include

15

#include int main() {

int val=5; //child 1

if(fork()==0){

val=val+1;

printf(\ exit(0); }

//child 2 if(fork()==0) {

val=val+1;

printf(\ exit(0); }

// wait for all children to terminate while (wait(NULL) >0 ); printf(\ return 0; }

分析并编译上述程序,观察运行结果,试考虑如何保证运行结果的正确?结合输出结果分析程序的流程。 3. 生产者和消费者问题

编制一段程序,实现经典的进程同步问题生产者和消费者问题。下面程序使用共享存储区域技术实现进程通信,其中两个子进程作为消费者,一个子进程作为生产者。

定义说明:

struct sembuf {

unsigned short sem_num; /* semaphore index in array */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ };

union semun {

int val; /* value for SETVAL */

struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ unsigned short *array; /* array for GETALL & SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ void *__pad; };

<参考程序>

#include #include

16

搜索更多关于: 操作系统实验指导书 的文档
操作系统实验指导书.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c875xg8zv7q670es7bbei_4.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top