进程调用实验

上传人:飞*** 文档编号:43558901 上传时间:2018-06-06 格式:DOC 页数:5 大小:47.50KB
返回 下载 相关 举报
进程调用实验_第1页
第1页 / 共5页
进程调用实验_第2页
第2页 / 共5页
进程调用实验_第3页
第3页 / 共5页
进程调用实验_第4页
第4页 / 共5页
进程调用实验_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《进程调用实验》由会员分享,可在线阅读,更多相关《进程调用实验(5页珍藏版)》请在金锄头文库上搜索。

1、附录:与实验相关的系统调用附录:与实验相关的系统调用1、int fork( )创建一个新进程创建一个新进程 返回值的意义:0,创建子进程,从子进程返回的id值 -1,创建失败 大于0,从父进程返回的子进程id值 2、lockf(files, function, size)锁定锁定/解锁文件或文件的某段解锁文件或文件的某段 该函数的头文件为:#include 参数定义:int lockf(int files, int function, long size) 含义:files是文件描述符; function为1表示锁定,为0表示解锁; size是锁定或解锁的字节数,若用0,表示从文件的当前位置到

2、文件尾。 3、msgget(key, flag)获得一个消息的描述符,该描述符指定一个消息队列以便用于其获得一个消息的描述符,该描述符指定一个消息队列以便用于其 它系统调用它系统调用 该函数使用头文件:#include #include #include 参数定义:int msgget(key_t key, int flag) 语法格式:msgqid=msgget(key, flag) 含义:msgqid是该系统调用返回的描述符,失败则返回-1 flag本身由操作允许权和控制命令值相“或”得到 4、msgsnd(id,msgp,size,flag)发送消息发送消息 该函数使用头文件:#incl

3、ude #include #include 参数定义:int msgsnd(int id, struct msgbuf * msgp, int size, size flag) 含义:id是返回消息队列的描述符; msgp是指向用户存储区的一个构造体指针; size指示由msgp指向的数据结构中字符数组的长度,即消息长度; flag规定当核心用尽内部缓冲空间时应执行的动作。若在标志flag中未设置 IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数 超过某一最大值时,调用msgsnd的进程睡眠。若设置了IPC_NOWAIT,则在此情况下, msgsnd立即返回。

4、 5、msgrcv(id,msgp,size,type,flag)接收消息接收消息 语法格式:count=msgrcv(id,msgp,size,type,flag)。count返回消息字节数。 头文件和参数含义基本同msgsnd一样。不同处在于: 多了参数type。type表示用户要读的消息的类型。type为0,表示接收该队列的第 一个消息;为正,接收类型type的第一个消息;为负,接收小于或等于type绝对值的最 低类型的第一个消息。 参数flag:规定倘若该队列无消息,核心应当做什么。如果在flag中设置了 IPC_NOWAIT 标志,则立即返回;若设置了MSG_NOERROR标志,且所

5、接收的消息 大小大于size,核心截断所接收的消息。6、msgctl(id,cmd,buf)查询或设置一个消息描述符的状态,或删除一个消息描述符查询或设置一个消息描述符的状态,或删除一个消息描述符 头文件同上述3、4、5函数 参数:id,消息描述符;buf,是含有控制参数或查询结果的用户数据结构的地址; cmd,命令类的型: 若为IPC_STAT,将与id相关联的消息队列首标读如buf; 若为IPC_SET,为该消息队列设置状态 若为IPC_RMID,删除id代表的消息队列 7、shmget(key,size,flag)获得一个共享存储区,存储区关键字为获得一个共享存储区,存储区关键字为key

6、,存储区长度为,存储区长度为size 该函数使用头文件:#include #include #include 参数定义:int shmget(key_t key, int size, int flag) 语法格式:id=shmget(key, size, flag),其中,id是共享存储区的标识符 8、shmat(id, addr, flag)从逻辑上将一个共享存储区附接到进程的虚拟地址空间上从逻辑上将一个共享存储区附接到进程的虚拟地址空间上 函数头文件同7 语法格式:virtaddr = shmat (id, addr, flag) 参数含义:id,共享存储区的标识符;addr,是用户要使用

7、共享存储区附接的虚地址; flag规定对此区的读写权限。 9、shmdt(addr)把一个共享存储区从指定进程的虚地址断开把一个共享存储区从指定进程的虚地址断开 函数头文件同7 语法:int shmdt(char * addr),若成功,返回0,否则返回-1。addr是该系统调用所返回 的地址。 10、shmctl(id, cmd, buf)对与共享存储区关联的参数进行操作,从而控制共享存储区对与共享存储区关联的参数进行操作,从而控制共享存储区 头文件同7 语法格式:int shmctl(int id, int cmd, struct shmid_ds *buf) 参数含义:id是共享存储区的

8、标识符;buf是一个用户级数据结构地址; cmd规定操作类型,规定如下: IPC_STAT:返回*buf中的各种状态信息 IPC_SET:设置状态信息 IPC_RMID:删除共享存储区 SHM_LOCK:在内存中锁定指定的共享存储区(root用户有此权) 11、signal(sig, function)允许调用进程控制软中断信号的处理允许调用进程控制软中断信号的处理 头文件#include 参数定义signal(int sig, void (* func)( ) ) sig的值可以是SIGHVP、SIGINT、SIGALRM、SIGQUIT等,模拟代表了各种中断 function是该进程中的一

9、个函数地址。在核心返回用户态时,它以软中断信号的序号为 参数调用该函数。实验实验 3 进程管理进程管理实验目的实验目的1、加深对进程概念的理解,明确进程和程序的区别 2、进一步认识并发执行的实质 3、分析进程争用资源的现象,学习解决进程互斥的方法实验内容实验内容1、进程的创建、进程的创建 编写一段程序,使用系统调用 fork( )创建两个子进程。当此程序运行时,在系统中有 一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符串:父进程显示“parent” ;两个子进程分别显示“son”和“daughter” 。多运行几次该程序,观察屏幕上的 显示结果,并分析原因。#include mai

10、n() int p1,p2; while(p1=fork( )= = -1);/*创建子进程 p1,直到成功*/ if(p1= =0) printf(“son”); /*子进程 p1 执行*/ else while(p2=fork( )= = -1);/*创建子进程 p2,直到成功*/ if(p2= =0) printf(“dauthter”); /*子进程 p2 执行*/ else printf(“parent”); /*父进程执行*/ 分析:从进程并发执行来看,输出有多种情况。可能是 son 在前,也可能是 parent 和 daughter 在前。 原因:fork()创建进程所需的时间可

11、能要多于输出一个字符串的时间,因此在主进程创 建进程 p2 的同时,进程 p1 就输出了 son,而 p2 和主进程的输出次序是随机的。(对程序对程序 1 稍做修改稍做修改,修改处用红色标注修改处用红色标注) #include main() int p1,p2,i; while(p1=fork( )= = -1);/*创建子进程 p1*/ if(p1= =0) for(i=0;i #include #include main() int p1, p2, i, *fp; fp = fopen(“to_be_locked.txt“,“w+“); /*新建文件 to_be_locked.txt,并打

12、开*/ if(fp= =NULL) printf(“Fail to create file“); exit(-1); while(p1=fork( )= = -1); /*创建子进程 p1*/ if (p1= =0) lockf(*fp,1,0); /*对文件加锁*/ for(i=0;i10;i+) fprintf(fp,“ son %dn“,i); /*输出到文件*/ lockf(*fp,0,0); /*对文件解锁*/ else while(p2=fork( )= =-1); /*创建子进程 p2*/ if (p2= =0) lockf(*fp,1,0); /*加锁*/ for(i=0;i1

13、0;i+) fprintf(fp,“ daughter %dn“,i); /*输出到文件*/ lockf(*fp,0,0); /*解锁*/ else wait(NULL); lockf(*fp,1,0); /*加锁*/ for(i=0;i10;i+) fprintf(fp,“parent %dn“,i); /*输出到文件*/ lockf(*fp,0,0); /*解锁*/ fclose(fp);/*关闭文件*/ 运行该程序,然后用命令 cat to_be_locked.txt 查看结果,并分析原因思考题思考题1、在程序 3 中,若将所有 lockf 函数中的*fp 改为 1,结果又如何?(提示:1 表示标准设 备打印机) 2、系统是怎样创建进程的? 3、可执行文件加载时进行了哪些处理? 4、当首次调用新创建进程时,其入口在哪里?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号