- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OS实验3
实验3:UNIX/Linux进程控制系统调用
1、实验目的
(1)掌握fork()系统调用的功能与编程方法;
(2)掌握exec系列系统调用使用方法与机制;
(3)掌握system()系统调用的使用。
2、实现设备
一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。
3、实验方法与注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。
要求认真读懂程序,分析程序,并根据执行结果,分析原因。
用户要按通常实验要认真书写实验报告。
4、实验过程
1)进程的创建
main()
{
int i;
printf(This is a test program for fork()!\n);
while((i=fork())==-1); //若创建失败,则反复创建
printf(i=%d\n,i); //打印进程标识符
if(i) printf(Parent process!\n); //i0,在父进程中
else printf(Child process!\n); //i=0,在子进程中
printf( ========END==========!\n);
}
编译并执行之,观察结果并分析原因。
(1)编译,设文件名为f.c,编译方法为
①按默认方式: cc f.c //生成可执行a.out
执行: ./a.out
②生成指定可执行文件,比如f: cc –o f f.c
执行: ./f
(2)观查并分析输出结果
2)exec命令的使用
在Unix/Linux系统中,exec是shell的内容命令,当使用exec使用某个shell命令时,被调用者将覆盖调用者。可试试命令:
exec ls
执行结果是,出现了登录界面(TUI),或关闭了当前窗口(CUI)。主要原因是ls命令的上下文覆盖当前shell的上下文。
在编程时,若使用了exec系列的系统调用去执行一个shell命令也会性同样的结果,因此当shell要执行一个命令时总是先创建一个子进程,然后由子进程执行程序,而父进程等待子进程结束,事实上是等待被执行者结束。
3)进程控制
用execlp调用实现一个shell的基本处理过程。
利用fork-exec可实现一个shell的基本功能。用户输入命令后,
(a)利用fork,
(b)利用exec,
(c)利用wait,
用C语言实现的程序例如下所示。
#include stdio.h
main()
{
char cmd[100]; //#预留命令缓冲区,最长不得超过100个字符
char *p=$ Ctrl_D to exit! $; //#定义提示符串
while(printf(%s,p),gets(cmd)!=NULL)
{
if(fork()==0){
if(execlp(cmd,cmd,(char*)0)==-1){
fprintf(stderr,String %s is not a CMD!\n,cmd);
exit(-1);
}
}
else wait(0);
}
}
假如程序的名字为e.c,请编辑、编译、调试之并观查结果。在进入程序的执行界面时,可以分别输入ls 和who后回车,观查程序的输出,最后按组合键Ctrl+D退出。
注意:
(1) 在命令执行过程中可以通过Ctrl+D退出;
(2) 此程序有不少问题,最发现的是当输入为白空格串(由空格和tab键组成的串)时,甚至是回车时它也会fork一个子进程,并且报告错误。输入的前导和尾部空格并未真正处理(也就是说仍作为倒入的一部分)。若处理前导空格可使用valid_cmd函数。请改进此程序,也消除尾部空格。
4)信号的使用
(1)kill与ps命令
命令ps是用于系统中进程状态查询的,ps -e可以查询系统中的所有进程及其状态,必要时可以使用ps –e | less分屏查看。
①编制一段程序,使其实现进程的软中断通信。
a. 要求编写一个程序,简单地实现进程间软中断通讯
#include signal.h
#include stdio.h
int int_int()
{
printf(I receive SIG_INT!\n);
}
int int_usr1()
{
printf(I receive SIG_USR1!\n);
}
main()
{
printf(MyPid=%d\n,getp
原创力文档


文档评论(0)