2009操作系统实验指导书Vmware版 - 图文(2)

2019-03-28 08:57

? 为子进程创建进程映像: ? 创建子进程映像静态部分:复制父进程映像静态部分 ? 创建子进程映像动态部分:初始化task_struct结构 ? 结束创建,置子进程为内存就绪状态,插入就绪队列,作为一个独立的进程被系统调度。 ? 若调用进程(父进程)返回,则返回创建的子进程标识符pid值(此时返回值>0); ? 若子进程被调度执行,则将其U区计时字段初始化然后返回(此时返回值=0)。

进程睡眠系统调用:sleep() 格式 参数 功能 进程终止系统调用:exit(status) 格式 参数 void exit(int status); status是子进程向父进程发送的终止信息,父进程使用wait( )系统调用来接收这个信息 将进程置僵死状态 功能 释放其所占有的资源 向父进程发本进程死信号,并发送信息status给父进程,将自己及自己的子进程运行CPU的时间总和留待父进程使用wait( )收集 sleep(n); n表示延时的秒数 进程睡眠n秒 头文件 #include 子进程终止时操作系统做以下工作: ? 关闭软中断:因为进程即将终止而不再处理任何软中断信号; ? 回收资源:关闭所有已打开文件,释放进程所有的区及相应内存,释放当前目录及修改根目录的索引节点; ? 写记帐信息:将进程在运行过程中所产生的记帐数据(其中包括进程运行时的各种统计信息)记录到一个全局记帐文件中; ? 置该进程为僵死状态:向父进程发送子进程死的软中断信号,将终止信息status送到指定的存储单元中; ? 转进程调度:因为此时CPU已经被释放,需要由进程调度进行CPU再分配。

父进程等待子进程终止系统调用:wait()与waitpid() 格式1 参数 返回值 pid_t wait([int *stat_addr,] 0); *stat_addr中存放exit()所发来终止信号stat的值。 >=0 =-1 表示有子进程终止,其值为终止子进程的pid号 表示无子进程终止 头文件 #include < sys/wait.h > #include < sys/types.h > 5

功能 父进程使用它等待任意一个子进程终止,如果在执行wait()之前已经有一个子进程结束了,则对其做善后处理,并返回子进程的pid号,如果没有则返回-1,该进程阻塞,插入等待子进程终止的队列,当有子进程终止时被唤醒。在&stat_addr中保留了子进程僵死时的终止信息(不是返回值)。 注意:一个wait()只能用来等待一个子进程终止,如果等待多个子进程终止则需要使用多个wait()。 pid_t waitpid (pid_t pid, int * stat_addr, int options ); pid=0 等待与父进程同组的子进程 等待给定pid号的子进程 pid=-1,options=0 等同于wait(),等待任意子进程 pid>0 等待指定pid的子进程终止 格式2 参数 功能 说明:1)若父进程仅仅只是等待任意一个子进程结束,而不需要取子进程发来的信号,则可以简单地使用wait(0)。 2)如果该进程没有创建自己的子进程就不能使用wait()或waitpid(),否则系统会返回一个出错信息。 3)如果要取子进程执行exit()后所发来的终止信号stat,可以使用*stat来取该变量中的值,而不能使用wait()的返回值,因为wait()的返回值是该终止子进程的pid号。 将指定的可执行文件加载到指定进程映像中,覆盖该进程中原有的程序 系统调用:execl()、execle()、execlp()、execv()、execve()与execvp() 功能 将一个指定的程序装入调用它的进程的映像中,用这个可执行文件的副本去覆盖该进程的程序空间,从而改变调用进程的执行代码,使调用进程执行新引入的可执行程序(二进制代码文件) 内核在响应这组系统调用后做以下工作: 1)根据给出的路径名找到指定的可执行文件,检查该文件是否可执行,用户是否具有执行权限(该文件必须是编译连接后的二进制代码)。 2)将该文件载入到调用它的进程映像中覆盖其原来的程序。 3)为该程序的执行设置参数数组和环境变量。 4)启动该进程进入新的程序入口点去执行。 此组函数执行时,如果加载成功则直接执行,没有返回;若加载不成功则返回-1。 格式1 参数 功能 execv(file, argv) char *file 指向文件全名(路径名/文件名)的指针 char *argv[n] 指向命令及参数的指针 1)执行参数指定的命令或文件。 2)用该命令或可执行文件的副本覆盖调用它的子进程的映像 表示错误返回 返回值 =-1 头文件 #include 格式2 说明 execl(“路径名/文件名”, 0) 功能、返回值、头文件均同格式1 使用方法: 1)事先准备好子进程要执行的程序,并将它编译连接成可执行文件,记下该文件的路径名和文件名。如果不带参数则可以直接使用execl(),带参数则使用execv()。 2)在父进程创建子进程之前,在程序中事先定义子进程要执行的程序文件的文件标识符path6

和参数数组argv[],其中的环境值可以用NULL取代。如果不带参数使用execl(),则这一步可以不做。 3)创建子进程后,在子进程的分支中,如果不带参数使用execl(filepath,0),如果带参数则使用execv(filepath,argv)来实现用指定的程序filepath覆盖子进程映像中原有的程序。 7

实验4进程通信

一、实验目的

1、加深理解进程通信的方法与原理;

2、掌握如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信。

二、实验内容 1、了解系统调用pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。

2、编写一C语言程序,使其用管道来实现父子进程间通信。子进程向父进程发送字符串“is sending a message to parent!”;父进程则从管道中读出子进程发来的消息,并将其显示到屏幕上,然后终止。

3、运行该程序,观察、记录并简单分析其运行结果。

三、有名管道、无名管道系统调用 1、创建无名管道的系统调用 创建无名管道的系统调用:pipe() 格式 返回值 参数说明 功能 int pipe(int 管道名[2]); 0 1 正确返回 错误返回 管道名[1]:为写入端 管道名[2]:为读出端 创建一个管道名为指定名称的无名管道,以便于创建管道的进程及其子孙进程共享 头文件 include ? 当进程向管道中写时,数据就复制不予考虑了共享的数据页; ? 从管道中读时,字节从共享页中按照FIFO的顺序复制出来。

? 当所有进程完成管道的操作后,管道的i结点和共享数据页被释放。

进程A的file结构i结点finodefop文件操作函数read、write等fp[1]父子进程write(fp[1],buf,size)finodefop文件操作函数read、write等fp[0]read(fp[0],buf,size)父子进程进程B的file结构数据页pipe(fp)图:管道的实现与父子进程的读写操作

2、读写管道的系统调用 读写管道的系统调用:write()、read() 格式 write(管道名[1], buf, size) 8

read(管道名[0], buf, size) 参数说明 说明 buf:程序中定义的字符型数组或缓冲区; size:读写的信息长度 管道为临界资源,父子进程之间除了需要读写同步以外,在对管道进行读写操作时还需要互斥进入。 为了保证管道操作过程中不至于因为用户的疏忽而死锁,Linux采用以下措施来避免死锁: ? 当进程因读或写等待时,要检查管道的另一端是否已经关闭,如果发现对方已经关闭则

直接返回,不再等待。

? 当进程关闭管道时,要检查管道的另一端是否正处于等待状态,如果是,则要先唤醒对

方,然后再关闭管道。

? 如果进程需要实现互斥,因为管道是文件,可以使用对文件上锁和开锁的系统调用。

3、文件上锁、开锁系统调用 文件上锁、开锁系统调用:lockf() 格式 lockf(files, function, size) files 参数说明 function size 是需要加以封锁的文件描述符,此处可以是管道的读写端口 为1表示上锁,为0表示开锁 表示锁定或开销的字节数,其值为0则表示文件全部内容

4、命名管道创建系统调用 命名管道创建系统调用:mkfifo() 格式 功能 返回值 头文件 int mkfifo(const char *pathname, mode_t mode); 专门用于创建FIFO 权限值,如0777表示所有用户都可读、可写、可执行 正确返回0,错误返回-1. #include #include 参数说明 mode mknod用于创建一般的设备文件

四、Linux消息缓冲通信的系统调用

1、创建一个消息队列或获取已存在消息队列的标识 创建消息队列/获取已存在消息队列的系统调用:msgget() 命令格式 int msgget(key_t key, int msgflag); 功能 返回值 创建标识为key值的消息队列或者获取已存在的消息队列的描述符msgid 正确返回该消息队列的描述符msgid; 错误返回-1。 msgqid 参数说明 key flag 头文件 9

语句格式 msgid=msgget (key, msgflag); 该系统调用返回的消息队列描述符,-1表示失败; 用户指定的消息队列标识符,为一正整数,其值可以由用户指定,如果使用IPC_PRIVATE则由系统产生key值; 用户设置的标志或访问方式,其值由操作权限和控制命令进行或运算得到 #include #include


2009操作系统实验指导书Vmware版 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:工程材料习题集8

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: