LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 962|回复: 11

一个多进程程序的问题

[复制链接]
发表于 2005-11-1 14:26:50 | 显示全部楼层 |阅读模式
现在我有一个程序,运行后fork出5个子进程,
这六个进程都有标准输出。

但是我现在想把它们的标准输出重定向到一个文件里,
因为五个子进程之间有信号量来保证一定的互斥关系,而且有随机性。
所以输出的顺序很关键,我想把这六个进程的输出重定向到一个文件里,
怎么办?

直接这样不行,顺序是错的:
./philosopher > result &

不知有没有人可以指教一下?
发表于 2005-11-1 14:50:13 | 显示全部楼层
man dup2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-1 14:59:51 | 显示全部楼层
我不想改程序,直接在命令行下处理不行吗?
回复 支持 反对

使用道具 举报

发表于 2005-11-1 16:26:59 | 显示全部楼层
怎么样的顺序错误?又为什么顺序很重要?
回复 支持 反对

使用道具 举报

发表于 2005-11-1 16:33:13 | 显示全部楼层
难道你在默认stdout中打出的顺序跟重定向后打印出的顺序不同吗?如果相同,就是你程序本身的逻辑关系设计错了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-1 21:30:41 | 显示全部楼层
因为用到了信号量来保证各个进程之间的同步和互斥,所以输出的顺序很重要,程序是否正确运行就是看各个进程的输出顺序。
但是因为是进程,所以我用这个命令:
./philosopher > result
的时候就不是一个进程在往result文件里写,而是五个!文件输出和标准输出不一样的吧?
回复 支持 反对

使用道具 举报

发表于 2005-11-1 21:45:03 | 显示全部楼层
应该是一样的啊,重定向只是定向文件描述符,不重定向的时候是五个进程往标准输出(屏幕〕写入数据,而重定向后是向你的文件中写入数据,这个文件其实就是代表你重定向之前的屏幕,所以应该是一样的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-1 22:12:37 | 显示全部楼层
不会一样的,>把5个相对独立的进程的标准输出同时重定向到了一个文件里,等于说五个进程并发地往一个文件里输入。这个输出和标准输出是不一样的。
而且我仔细看了一下,还不光是顺序,还有重复的输出(就是其中各个进程的输出重复出现了)

在标准输出下是5个子进程的同步是设计好的,结果也是正确的……
有可能就是没有办法解决,算了,直接在程序里写文件输出好了……
回复 支持 反对

使用道具 举报

发表于 2005-11-2 10:17:23 | 显示全部楼层
Post by pank7.yardbird
不会一样的,>把5个相对独立的进程的标准输出同时重定向到了一个文件里,等于说五个进程并发地往一个文件里输入。这个输出和标准输出是不一样的。
而且我仔细看了一下,还不光是顺序,还有重复的输出(就是其中各个进程的输出重复出现了)

在标准输出下是5个子进程的同步是设计好的,结果也是正确的……
有可能就是没有办法解决,算了,直接在程序里写文件输出好了……

肯定是在父进程里有print,又没有fflush,所以其内容被子进程继承了!不过你要说在默认标准输出中是对的,我就觉得奇怪了!
回复 支持 反对

使用道具 举报

发表于 2005-11-2 10:41:03 | 显示全部楼层
Post by pank7.yardbird
不会一样的,>把5个相对独立的进程的标准输出同时重定向到了一个文件里,等于说五个进程并发地往一个文件里输入。这个输出和标准输出是不一样的。
而且我仔细看了一下,还不光是顺序,还有重复的输出(就是其中各个进程的输出重复出现了)

在标准输出下是5个子进程的同步是设计好的,结果也是正确的……
有可能就是没有办法解决,算了,直接在程序里写文件输出好了……

其实重定向仅仅是改变文件描述符所指代的地方,就像让你把酒倒在杯子里,而现在让你倒在碗里,除了倒的地方不一样以外好像没有什么区别的!对于将屏幕重定向到一个文件也是如此道理,屏幕作标准输出描述符为1,现在将描述符1指定给一个文件,这个文件仅仅是在这个命令下取代了屏幕的作用,注意仅仅是取代,没有作任何的改变,所以我个人认为应该是一样的。至于说“五个进程并发的往文件中写入数据和往屏幕上写数据不同”这个说法我觉得不对或者说不是很懂,难道不做重定向时五个进程就不是并发的向屏幕写入数据?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表