正在学习OS课程,尝试了一些系统进程管理的实验,刚开始对进程的并发用实验验证时总是与书本上的结果不同,一般在书上,10几句循环就可以看出进程的并发执行,可是我怎么实验也得不到那样的结果,仔细看看才发现,在书本上的程序中都使用了sleep函数。但是,如果从原理上来讲,不用sleep只要循环执行就应该可以看到进程的循环执行的,最后还是听了老师的意见,加大循环次数,当我将循环次数加到10000时,果然看到预想的结果了。
程序代码如下:
#include
<
stdio.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i,pid;
int N=10000;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
pid=fork();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if(pid==0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf("Child start,PID is %d,PPID is %d ",getpid(),getppid());
for(i=0;i<N;++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf("Child print %d ",i);
}
}else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf("Parent start,PID is %d,PPID is %d ",getpid(),getppid());
for(i=0;i<N;++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf("Parent print %d ",i);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
printf("Process %d terminated! ",getpid());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return 0;
}
在运行结果中出现如下的片段:
![]()
![]()
![]()
由此结果可以看出,printf函数在输出的任何时候都可能被中止。
此外,在实验时,在Linux和Solaris上都试过,在Linux上,每次都是子进程先,父进程后;而在solaris上却相反是父进程先,子进程后。