ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:23.01KB ,
资源ID:21549215      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21549215.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验进程控制Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验进程控制Word文档格式.docx

1、 wait() 系统调用语法:sys/types.hsys/wait.h pid_t wait(int *status); pid_t waitpid(pid_t pid,int *status,int option); status 用于保留子进程的退出状态 pid 可以为以下可能值: -1 等待所有 PGID 等于 PID 的绝对值的子进程 1 等待所有子进程 0 等待所有 PGID 等于调用进程的子进程 0 等待 PID 等于 pid 的子进程 option 规定了调用 waitpid 进程的行为: WNOHANG 没有子进程时立即返回 WUNTRACED 没有报告状态的进程时返回 wa

2、it 和 waitpid 执行成功将返回终止的子进程的进程号,不成功返回-1。 getpid()系统调用语法: pid_t getpid(void); pid_t getppid(void); getpid 返回当前进程的进程号,getppid 返回当前进程父进程的进程号 2) 与进程控制有关的系统调用说明 可以通过信号向一个进程发送消息以控制进程的行为。信号是由中断或异常事件引发的,如:键盘中断、定时器中断、非法内存引用等。信号的名字都以 SIG 开头,例如 SIGTERM、SIGHUP。可以使用 kill -l 命令查看系统当前的信号集合。信号可在任何时间发生,接收信号的进程可以对接收到的

3、信号采取3种处理措施之一: 忽略这个信号 执行系统默认的处理 捕捉这个信号做自定义的处理信号从产生到被处理所经过的过程:产生 (generate)- 挂起 (pending)- 派送 (deliver)- 部署 (disposition) 或忽略(igore) 一个信号集合是一个 C 语言的 sigset_t 数据类型的对象,sigset_t 数据类型定义在中。被一个进程忽略的所有信号的集合称为一个信号掩码(mask)。 从程序中向一个进程发送信号有两种方法:调用 shell 的 kill 命令,调用kill系统调用函数。kill能够发送除杀死一个进程(SIGKILL、SIGTERM、SIGQ

4、UIT) 之外的其他信号,例如键盘中断(Ctrl+C)信号 SIGINT,进程暂停(Ctrl+Z)信号SIGTSTP 等等。 调用 Pause 函数会令调用进程的执行挂起直到一个任意信号到来后再继续运行。 调用 sleep 函数会令调用进程的执行挂起睡眠指定的秒数或一个它可以响应的信号到来后继续执行。 每个进程都能使用 signal 函数定义自己的信号处理函数,捕捉并自行处理接收的除 SIGSTOP 和 SIGKILL 之外的信号。以下是有关的系统调用的语法说明。kill 系统调用语法: int kill(pid_t pid, int sig); pid 接收信号的进程号 signal 要发送

5、的信号 kill 发送成功返回接收者的进程号,失败返回-1。pause 系统调用语法:include int pause(void); pause 挂起调用它的进程直到有任何信号到达。调用进程不自定义处理方法,则进行信号的默认处理。只有进程自定义了信号处理方法捕获并处理了一个信号后,pause 才会返回调进程。pause 总是返回-1,并设置系统变量 errno 为 EINTR。 sleep 系统调用语法:unsigned int sleep(unsigned int seconds);seconds 指定进程睡眠的秒数如果指定的秒数到,sleep 返回 0。signal 系统调用语法为: t

6、ypedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);signum 要捕捉的信号 handler 进程中自定义的信号处理函数名 signal 调用成功会返回信号处理函数的返回值,不成功返回-1,并设置系统变量 errno 为 SIG_ERR。1.3 示例实验 以下实验示例程序应实现一个类似子 shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行. 1) 打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立以下名为pctl.c 的C语

7、言程序:/* * Filename : pctl.c * copyright : (C) 2006 by zhanghonglie * Function : 父子进程的并发执行 */ #include pctl.hint main(int argc, char *argv) int i; int pid; /存放子进程号 int status; /存放子进程返回状态 char *args = /bin/ls,-a,NULL; /子进程要缺省执行的命令 signal(SIGINT,(sighandler_t)sigcat); /注册一个本进程处理键盘中断的函数 pid=fork() ; /建立子

8、进程 if(pid= 0) %d Wakeup %d child.n,getpid(),pid) ;%d dont Wait for child done.nn return EXIT_SUCCESS; 2) 再建立以下名为 pctl.h 的 C 语言头文件:wait.hstdio.hstdlib.h/进程自定义的键盘中断信号处理函数 typedef void (*sighandler_t) (int); void sigcat() %d Process continuen3) 建立以下项目管理文件 Makefile head = pctl.h srcs = pctl.c objs = pct

9、l.o opts = -g -c all: pctl pctl: $(objs) gcc $(objs) -o pctl pctl.o: $(srcs) $(head) gcc $(opts) $(srcs) clean: rm pctl *.o 4) 输入 make 命令编译连接生成可执行的 pctl 程序 $ gmake gcc -g -c pctl.c gcc pctl.o -o pctl 5) 执行 pctl 程序(注意进程号是动态产生的,每次执行都不相同) $ ./pctl I am Child process 4113 My father is 4112 I am Parent p

10、rocess 4112 Wakeup 4113 child. 4112 dont Wait for child done. 4113 Process continue 4113 child will Running: /bin/ls -a . . Makefile pctl pctl.c pctl.h pctl.o $ 以上程序的输出说明父进程 4112 创建了一个子进程 4113,子进程执行被暂停。父进程向子进程发出键盘中断信号唤醒子进程并与子进程并发执行。父进程并没有等待子进程的结束继续执行先行结束了(此时的子进程成为了孤儿进程,不会有父进程为它清理退出状态了)。而子进程继续执行,它变成了

11、列出当前目录所有文件名的命令 ls -a。在完成了列出文件名命令之后,子进程的执行也结束了。此时子进程的退出状态将有初始化进程为它清理。6) 再次执行带有子进程指定执行命令的 pctl 程序:$ ./pctl /bin/ls -l I am Child process 4223 My father is 4222 I am Parent process 4222 4222 Waiting for child done. 可以看到这一次子进程仍然被挂起,而父进程则在等待子进程的完成。为了检测父子进程是否都在并发执行,请输入 ctrl+z 将当前进程放入后台并输入 ps 命令查看当前系统进程信息,

12、显示如下:1+ Stopped ./pctl /bin/ls -l $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 0 4085 4083 0 76 0 - 1413 wait pts/1 00:00:00 bash 1 T 0 4222 4085 0 76 0 - 360 finish pts/1 00:00 pctl 2 T 0 4223 4222 0 76 0 - 360 finish pts/1 00:0 R 0 4231 4085 0 78 0 - 1302 - pts/1 00:00 ps 可以看到当

13、前系统中同时有两个叫 pctl 的进程,它们的进程号分别是 4222 和 4223。它们的状态都为T,说明当前都被挂起。4223 的父进程是 4222,而 4222 的父进程是 4085,也就是 bash-shell。为了让 pctl 父子进程继续执行,请输入 fg 命令让 pctl 再次返回前台,显示如下:$ fg ./pctl /bin/ls -l 现在pctl父子进程从新返回前台。我们可以通过键盘发键盘中断信号来唤醒pctl 父子进程继续执行,输入 ctrl+c,将会显示:4222 Process continue 4223 Process continue 4223 child wil

14、l Running: /bin/ls -l total 1708 -rw-r-r- 1 root root 176 May 8 11:11 Makefile -rwxr-xr-x 1 root root 8095 May 8 14:08 pctl -rw-r-r- 1 root root 2171 May 8 14:08 pctl.c -rw-r-r- 1 root root 269 May 8 11:10 pctl.h -rw-r-r- 1 root root 4156 May 8 14:08 pctl.o My child exit! status = 0 以上输出说明了子进程在捕捉到键盘

15、中断信号后继续执行了指定的命令,按我们要求的长格式列出了当前目录中的文件名,父进程在接收到子进程执行结束的信号后将清理子进程的退出状态并继续执行,它报告了子进程的退出编码(0 表示子进程正常结束)最后父进程也结束执行。1.4 实验结果 参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps 命令总在 ls 命令之前执行。1.5. 实验小结第一次实验的操作是比较简单的,通过老师的讲解,很快就能掌握要点,但是在执行过程中,很容易打错字符或漏掉标点符号,导致实验结果不正确,通过不断查找与更改,最后得出正确结论。此次实验很需要耐心和毅力,能不断加强我们的动手能力后调试能力。

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

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