#include<stdio.h> main() { int p1,p2,i; if(p1=fork()) { lockf(1,1,0); for(i=0;i<5000;i++) printf("child %d\n",i); lockf(1,0,0); } else { if(p2=fork()) { lockf(1,1,0); for(i=0;i<5000;i++) printf("son %d\n",i); lockf(1,0,0); } else { lockf(1,1,0); for(i=0;i<5000;i++) printf("daughter %d\n",i); lockf(1,0,0); } } } |
这个实验的目的是想让学生体会到加上lockf的作用,可以互斥的显示在屏幕上。即:完全输出child后完全输出son或者再完全输出daughter。但是真正做实验的时候,发现三个进程还是并发的把结果显示在屏幕上,即:child输出到4000多行,就又开始输出son了。。。。
请问这是为什么呢?错在哪里呢?lockf()不就是加锁,能够保证互斥吗?
原帖由 乌龙张 于 2008-10-23 22:03 发表
谢谢楼上朋友。
经过fock之后是有多个进程并发执行。
我的目的并不是“先child输出,再son输出”,进程并发执行,谁先被输出都有可能。
我是认为加上了lockf之后,如果一个进程先得到执行,应该连续输出500行 ...
原帖由 duanjigang 于 2008-10-24 09:17 发表
你把结果重定向到文件中检查下
test_prog > result.txt
然后检查0-5000行,5000-10000行,10000-15000行是否有别的字符串
未命名.jpg (5.17 KB, 下载次数: 34)
原帖由 timespace 于 2008-10-24 12:46 发表
呵呵,开始还以为你真的直接从终端屏幕捕捉了该现象!
原来经过重定向啊,那么一切都容易解释了: ... | proc或者 ... > file,标准输出重定向后变为全缓存,此时输出结果用术语说就是unspecified或undefined。 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |