免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5097 | 回复: 19
打印 上一主题 下一主题

一个linux进程实验问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-22 20:25 |只看该作者 |倒序浏览
以下为linux环境下的操作系统“进程控制”实验相关部分:
#include<stdio.h>
main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int p1,p2,i;
&nbsp;&nbsp;&nbsp;&nbsp;if(p1=fork())
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,1,0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5000;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("child %d\n",i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,0,0);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(p2=fork())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,1,0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5000;i++) printf("son %d\n",i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,0,0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,1,0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5000;i++) printf("daughter %d\n",i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockf(1,0,0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

这个实验的目的是想让学生体会到加上lockf的作用,可以互斥的显示在屏幕上。即:完全输出child后完全输出son或者再完全输出daughter。
但是真正做实验的时候,发现三个进程还是并发的把结果显示在屏幕上,即:child输出到4000多行,就又开始输出son了。。。。
请问这是为什么呢?错在哪里呢?lockf()不就是加锁,能够保证互斥吗?

请高手回答,谢谢!

[ 本帖最后由 duanjigang 于 2008-10-23 06:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-22 21:23 |只看该作者
帮顶一下,我也想知道答案!

论坛徽章:
0
3 [报告]
发表于 2008-10-23 06:59 |只看该作者
这个实验的目的是想让学生体会到加上lockf的作用可以互斥的显示在屏幕上。即:完全输出child后完全输出son或者再完全输出daughter。但是真正做实验的时候,发现三个进程还是并发的把结果显示在屏幕上,即:child输出到4000多行,就又开始输出son了。。。。
请问这是为什么呢?错在哪里呢?lockf()不就是加锁,能够保证互斥吗?

首先:体会到加上lockf的作用,说得很不明白,lockf是实现什么作用的,进程之间互斥还是线程之间互斥,看代码应该是进程之间实现互斥的。
其次:你的目的是先child输出,再son输出,但是请仔细分析代码,即使你的lock有效,这样的代码结构能打到效果吗?fork()返回之后子进程和父进程就开始并发执行了,谁能先调用lockf在原理上说是不能确定的。还有:“lockf不就是加锁,能保证互斥吗?”不明白你说的意思,太混沌了。
举个例子,如果你的目的是实现进程之间的互斥,却采用了线程互斥的技术实现了lockf,那么每个进程都在lockf,是没有一点作用的,当然我猜测你的lockf很可能就是在用flock方法。
楼主先把问题说清楚吧,呵呵

[ 本帖最后由 duanjigang 于 2008-10-23 07:10 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-10-23 22:03 |只看该作者
谢谢楼上朋友。
经过fock之后是有多个进程并发执行。
我的目的并不是“先child输出,再son输出”,进程并发执行,谁先被输出都有可能。
我是认为加上了lockf之后,如果一个进程先得到执行,应该连续输出500行(不会被打断输出),而我在做实验的时候,输出child的时候,输出400多行child的时候被son的输出打断了。
我不明白为什么会被打断?
还请各位朋友继续帮助我,谢谢!

论坛徽章:
0
5 [报告]
发表于 2008-10-23 22:38 |只看该作者
lockf返回值是什么?成功了吗?

论坛徽章:
0
6 [报告]
发表于 2008-10-24 06:51 |只看该作者
原帖由 乌龙张 于 2008-10-23 22:03 发表
谢谢楼上朋友。
经过fock之后是有多个进程并发执行。
我的目的并不是“先child输出,再son输出”,进程并发执行,谁先被输出都有可能。
我是认为加上了lockf之后,如果一个进程先得到执行,应该连续输出500行 ...

我在上次回复中已经提到了,你的lockf是个什么咚咚?能实现进程互斥吗?这个你还没有回答

论坛徽章:
0
7 [报告]
发表于 2008-10-24 09:01 |只看该作者
原帖由 duanjigang 于 2008-10-24 06:51 发表

我在上次回复中已经提到了,你的lockf是个什么咚咚?能实现进程互斥吗?这个你还没有回答


lockf(files,function,size)

int files,function;

long size;

其中:files是文件描述符,0代表键盘,1代表显示器;

function是锁定和解锁,1表示锁定,0代表解锁;

size是锁定或解锁的字节数,为0表示从文件的当前位置到文件尾

论坛徽章:
0
8 [报告]
发表于 2008-10-24 09:15 |只看该作者
我刚刚测试了下,没有问题的
child,son,和daughter的打印都是分开的,没有混在一起。
我的系统是linux AS4
2.6.9-5.ELsmp

论坛徽章:
0
9 [报告]
发表于 2008-10-24 09:17 |只看该作者
你把结果重定向到文件中检查下
  1. test_prog > result.txt
复制代码

然后检查0-5000行,5000-10000行,10000-15000行是否有别的字符串

论坛徽章:
0
10 [报告]
发表于 2008-10-24 10:11 |只看该作者
谢谢朋友。
我是用GCC编译之后,用./a.out |more来观看结果的,看到0-5000行里并不是一种字符串,是两种混杂在一起。
所以我就是想不明白呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP