我有一个Linux进程,需要从键盘和鼠标中读取。它需要异步执行此操作,同时还要执行一些主要过程。
我提出的实现是将主进程放在一个线程中,并且有两个独立的线程总是从键盘和鼠标读取()。如果Linux read()被阻塞,当主线程继续执行(我想要的)时,键盘和鼠标线程是否会被阻塞,或者整个进程是否会被阻塞?
答案 0 :(得分:2)
进程中的所有线程都不会因进程中的一个或多个线程被阻塞而阻塞。如果能够在有效的调度程序规则内运行,则将调度每个线程。
所以你的设计非常有效。如果您读取的数据必须由另一个线程使用,请使用正确的同步技术。信号量和消息队列非常方便。
答案 1 :(得分:0)
您可以使用多个线程,answered by Amardeep,然后您需要同步技术(可能是Pthread condition variables和互斥)。然后阅读tutorial about pthreads。
请注意,对于终端中的真实键盘输入,您可能希望使用ncurses或readline等库(它们允许比经典getline(3)或fgets
方法更多的编辑;阅读tty demystified页面。
您还可以在event loop之类的多路复用系统调用周围找到poll(2)。见this example。然后你可以(或不)拥有一个线程。
你可能还想要一个图形用户界面(即窗口,按钮等......),然后你想使用像Qt或Gtk或libsdl等库,提供强大的事件循环。 (不敢直接进行低级X11编程,life is too short进行that。
您可能希望non-blocking IO(在事件循环中很方便),使用fcntl(2) F_SETFL
O_NONBLOCK
标记进行设置。
您可以执行Posix异步IO,请参阅aio(7)。
您可能希望通过SIGIO
signal(7)通知IO是可能的(但是请小心使用信号,通常信号处理程序只设置在其他位置测试的volatile sig_atomic_t
变量!) ,将fcntl
与F_SETOWN
一起使用(getpid(2)
的结果)和O_ASYNC
您还可以使用像libonion
这样的HTTP服务器库,使您的应用程序成为专门的Web服务器