- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
精品word
精品word
精品word
PAGE / NUMPAGES
试验三 进程管理及进程通信
试验环境:
Linux操作系统
试验目的:
〔1〕利用Linux供给的系统调用设计程序,加深对进程概念的理解。
〔2〕体会系统进程调度的方法和效果。
〔3〕了解进程之间的通信方式以及各种通信方式的使用。
试验方法:
用vi 编写c 程序〔假定程序文件名为prog1.c〕 编译程序
$ gcc -o prog1.o prog1.c
或 $ cc -o prog1.o prog1.c
运行
$./prog1.o
试验内容及步骤:
试验1
编写程序。显示进程的有关标识〔进程标识、组标识、用户标识等〕。经过5 秒钟后,执行另一个程序,最终按用户指示〔如:Y/N〕结束操作。
编程截图:
运行结果:
试验2
参考例程1,编写程序。实现父进程创立一个子进程。体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的方法。
例程1:利用fork()创立子进程
/* 用fork()系统调用创立子进程的例子*/
main()
{
int i;
if (fork()) /*父进程执行的程序段*/
i=wait(); /* 等待子进程结束*/{
printf(It is parent process.\n);
printf(The child process,ID number %d, is finished.\n,i);
}
else{
Printf(“It is child process.\n〞);
Sleep(10);
Exit();
}
}
运行结果:
思考:
子进程是如何产生的? 又是如何结束的?子进程被创立后它的运行环境是怎 样建立的?
答:是由父进程用fock()函数创立形成的,通过exit()函数自我结束,子进程被创立后核心
将其安排一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程全部文件。
试验3
参考例程2,编写程序。父进程通过循环语句创立假设干子进程。探讨进程的家族树以 及子进程继承父进程的资源的关系。
例程2:循环调用fork()创立多个子进程。
/*建立进程树*/
#includeunistd.h
main()
{ int i;
printf(“My pid is %d, my father’s pid is %d\n〞,getpid()
,getppid());
for(i=0; i3; i++)
if(fork()==0)
printf(“%d pid=%d ppid=%d\n〞, i,getpid(),getppid());
else
{ j=wait(0);
Printf(“ %d:The chile %d is finished.\n〞 ,getpid(),j);
}
}
运行结果:
思考:
① 画出进程的家族树。
1834答:进程家族树
1834
1835
1835
1841
1841
1839
1839
1836
1836
1838
18381840
1837
试验4
参考例程3 编程,使用fork( )和exec( )等系统调用创立三个子进程。子进程分别启动
不同程序,并结束。反复执行该程序,观看运行结果,结束的先后,看是否有不同次 序。
例程3:创立子进程并用execlp()系统调用执行程序的试验
/*创立子进程,子进程启动其它程序*/
#includestdio.h
#includeunistd.h
main()
{
int child_pid1,child_pid2,child_pid3;
int pid,status;
setbuf(stdout,NULL);
child_pid1=fork(); /*创立子进程1*/
if(child_pid1==0)
{ execlp(echo,echo,child process 1,(char *)0); /*子进程1 启动其它程序*/
perror(exec1 error.\n );
exit(1);
}
child_pid2=fork(); /*创立子进程2*/
if(child_pid2==0)
{ execlp(date,date,(char *)0); /*子进程2 启动其它程序*/
perror(exec2 error.\n );
exit(2);
}
child_pid3=fork(); /*创立子进程3*/
if(child_pid3==0)
{ execlp(ls,ls,(char *)0); /*子进程3 启动其它程序*/
perror(exec3 error.\n
文档评论(0)