LinuxSir.cn,穿越时空的Linuxsir!

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

监听多种消息是否需要多线程?

[复制链接]
发表于 2004-12-3 09:27:39 | 显示全部楼层 |阅读模式
一个程序中需要监听键盘输入和socket端口,用到两个while(1)这样的结构,我只知道用多线程实现,还有别的方法没?
发表于 2004-12-3 12:29:40 | 显示全部楼层
select,poll
发表于 2004-12-3 13:16:57 | 显示全部楼层
用 while(1) 是循环查询,浪费机器时间,合理的应该是 select,当键盘输入和 socket 端口都无输入时会阻塞,有输入时即唤醒。
 楼主| 发表于 2004-12-4 11:49:27 | 显示全部楼层
这两个函数我在unix环境高级编程上看到了,讲的不多,理解的不很好,所以想确认一下,是不是这样:
select节约了机器的资源,可以同时监听多个端口,但仍然需要一个循环来在每次监听到输入之后重新开启监听。

还有地方说可以用信号和中断来实现类似的功能,是不是指软中断?

另外,关于中断、阻塞、非阻塞这样的概念很不清楚,能不能简单说一下,或者告诉我哪本书上有详细的讲解,是不是在操作系统基础上?
发表于 2004-12-4 12:36:54 | 显示全部楼层
是在操作系统调度时,如果发现一个进程处于阻塞态,则不用调度该进程运行,这样节省了该进程本来要用的一定量的时间片,而用 while(1) 的话操作系统就不知道了,分配的时间片都用来做 while(1) 测试,这样就浪费了这些时间片。
而且 select 不会影响监听两路输入。如果你写过字符设备驱动的话,就知道 select 实现就是将该调用进程放入输入的等待队列中,即调用
  1. [color=blue]sleep_on(...);[/color]
复制代码
进程状态变为TASK_INTERRUPTIBLE。任何一路上有输入时,系统首先调用的便是该驱动程序,驱动程序便将等待队列上的所有进程都唤醒,即调用
  1. [color=blue]wake_up(...);[/color]
复制代码
进程状态变为 TASK_RUNNING。该进程被操作系统再一次调度到时,已处于就绪态,于是从 select 的下一句继续运行。
由此可见循环是仍然需要的。
  1. [color=blue]
  2.         while (1) {
  3.                 select(...);
  4.                 ...          // process one input
  5.         }[/color]
复制代码
似乎与信号机制关系不大。
 楼主| 发表于 2004-12-4 13:23:27 | 显示全部楼层
哇,解释这么仔细,谢谢哈。明白了
发表于 2004-12-5 03:17:36 | 显示全部楼层
其实 select 在 ldd2 那本书上写得最清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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