linux通道通信问题

走过海 发布于 2013/08/27 16:43
阅读 615
收藏 0
想写一个程序从通道或者其他地方获取数据(跟more一样,可以从通道获取,也可以用参数打开的文件),比如ls | my_program,ls的数据通过通道传送到我的程序,现在有以下问题。我的程序里面,如果使用阻塞I/O来读取,有可能用户根本没有使用通道,那么这样我的程序会一直等待用户输入数据,这不符合。如果使用非阻塞I/O,即使有数据,但是可能缓冲区没准备好导致非阻塞I/O出错返回,请问一下这要怎么弄?表达能力差,请谅解
加载中
0
中山野鬼
中山野鬼

堵塞是同步的,非堵塞是异步的,究竟你要同步还是异步?

你的输入是决定后面处理的,这个需要同步,也即只有等数据来了才能处理。

而你希望自己不占用系统资源,在等待时。

正常设计,对于存在同步性的两个进程,前者数据准备就绪后,唤醒后者。问题你这个无法实现。因为前者不是你的设计系统。

那么则你需要采用另一种策略,查询方式。 自身当资源不足时,睡眠指定时间,醒了后,看下资源到了没有,如同狗狗,睡醒了,发现没的吃,就继续睡。哈。

走过海
回复 @中山野鬼 : 好吧,我试睡一下。谢谢啦
中山野鬼
中山野鬼
回复 @loophy : 我都说了,你会让自己睡一会吗?
走过海
回复 @中山野鬼 : 在于判断通道那里,用阻塞,如果通道没有数据,那程序就会一直等待。如果用非阻塞,如果通道有数据而没有准备好,就会出错返回,试试用非阻塞的read,使用|传输数据到你的程序,并不是一定会成功返回的。如果用一个循环一直去读,跟你说的查询一样,这样非阻塞的就可以。但是我有两个地方获取数据,还有就是没有数据出错返回。这样,我觉得查询方式的话不太符合,或者,我没完全理解你的意思。。谢谢
中山野鬼
中山野鬼
回复 @loophy : 这些都是你自己的逻辑去实现。有什么问题呢?哈
走过海
回复 @中山野鬼 : 我要判断哪一个地方有数据,或者,根本就没数据传进来
下一页
0
泡不烂的凉粉
泡不烂的凉粉

什么通道不通道, 不就是管道么. 管道 不就一个文件么, 标准输入输出么, 不都是文件么.

文件直接用上层的读取函数来读不就行了么. 还管什么同步不同步的. more 的源码,有非常简练的版本, 非常的短,自己读一下不就清楚了么.

0
乌龟壳
乌龟壳
开一个线程去等就可以了,其它线程该干嘛干嘛。
返回顶部
顶部