欢迎来到天天文库
浏览记录
ID:11558373
大小:53.00 KB
页数:9页
时间:2018-07-12
《实验三020740309赵玉健》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验三:Windows线程及其调度观察一、实验目的:让同学们了解什么是线程,操作系统是如何调度它们的。二、实验要求:程序使用C语言实现。三、实验过程及程序实现intmain(){ inti; if(fork()==0) { for(i=1;i<3;i++) printf("Thisischildprocess"); } else { for(i=1;i<3;i++) printf("Thisisparentprocess"); }} 执行结果为:ThisischildprocessThisischildproces
2、sThisisparentprocessThisisparentprocess fork在英文中是“分叉”的意思,这个名字取得很形象。一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了。当前进程为父进程,通过fork()会产生一个子进程。对于父进程,fork函数返回子程序的进程号而对于子程序,fork函数则返回零,这就是一个函数返回两次的本质。可以说,fork函数是Unix系统最杰出的成就之一,它是七十年代Unix早期的开发者经过理论和实践上的长期艰苦探索后取得的成果。 如果我们把上述程序中的循环放的大一
3、点:intmain(){ inti; if(fork()==0) { for(i=1;i<10000;i++) printf("Thisischildprocess"); } else { for(i=1;i<10000;i++) printf("Thisisparentprocess"); }} 则可以明显地看到父进程和子进程的并发执行,交替地输出“Thisischildprocess”和“Thisisparentprocess”。 此时此刻,我们还没有完全理解fork()函数,再来看下面的一段程序,看看究竟会
4、产生多少个进程,程序的输出是什么?intmain(){ inti; for(i=0;i<2;i++) { if(fork()==0) { printf("Thisischildprocess"); } else { printf("Thisisparentprocess"); } }} exec 在Linux中可使用exec函数族,包含多个函数(execl、execlp、execle、execv、execve和execvp),被用于启动一个指定路径和文件名的进程。 exec函数族的特点体现在:某进程一旦
5、调用了exec类函数,正在执行的程序就被干掉了,系统把代码段替换成新的程序(由exec类函数执行)的代码,并且原有的数据段和堆栈段也被废弃,新的数据段与堆栈段被分配,但是进程号却被保留。也就是说,exec执行的结果为:系统认为正在执行的还是原先的进程,但是进程对应的程序被替换了。 fork函数可以创建一个子进程而当前进程不死,如果我们在fork的子进程中调用exec函数族就可以实现既让父进程的代码执行又启动一个新的指定进程,这实在是很妙的。fork和exec的搭配巧妙地解决了程序启动另一程序的执行但自己仍继续运行的问题,请看下面的例子
6、:charcommand[MAX_CMD_LEN];voidmain(){ intrtn;/*子进程的返回数值*/ while(1) { /*从终端读取要执行的命令*/ printf(">"); fgets(command,MAX_CMD_LEN,stdin); command[strlen(command)-1]=0; if(fork()==0) { /*子进程执行此命令*/ execlp(command,command); /*如果exec函数返回,表明没有正常执行命令,打印错误信息*/ perror(c
7、ommand); exit(errorno); } else { /*父进程,等待子进程结束,并打印子进程的返回值*/ wait(&rtn); printf("childprocessreturn%d",rtn); } }} 这个函数基本上实现了一个shell的功能,它读取用户输入的进程名和参数,并启动对应的进程。 clone clone是Linux2.0以后才具备的新功能,它较fork更强(可认为fork是clone要实现的一部分),可以使得创建的子进程共享父进程的资源,并且要使用此函数必须在编译内核
8、时设置clone_actually_works_ok选项。 clone函数的原型为:intclone(int(*fn)(void*),void*child_stack,intflags,void*arg)
此文档下载收益归作者所有