我正在执行一个运行游戏服务器的系统。我有一个进程("游戏控制器"),它创建两个管道对并派生一个子管道。子进程将STDIN转储到一个管道,将STDOUT和STDERR转储到另一个管道,然后运行execlp()
来运行游戏代码。
游戏控制器将有两个线程。第一个线程将阻塞accept()
在一个指定的UNIX套接字上接收来自另一个应用程序的输入,第二个线程阻塞read()
从游戏服务器输出和错误管道。
read()
处理,以便第一个线程可以从输出和错误管道读取应答。
(值得注意的是,我将知道回复有多少字符/行长,所以我将知道何时停止读取并让第二个线程继续读取,重置进程。)
我如何临时切换读控制到另一个线程,如上所述?
有几个选项。一种方法是让第二个线程处理所有的读取,并为第一个线程提供一种方式来通知它将输入传递回去。但这有点复杂;您需要设置一个在线程之间发送信号的方法,并确保第一个线程在第二个线程读取并处理输入之前告诉第二个线程它需要输入。有可能出现各种竞态条件,使您的代码不可预测。
另一个选择是完全避免使用线程。只需使用select(2)
(或poll(2)
)来允许一个线程同时等待多个文件描述符的活动。select
允许您指示您感兴趣的一组文件描述符。一旦其中一个发生任何活动(可以接受连接,可以读取数据),select
将返回,指示准备好的文件描述符集。然后,您可以接受或读取适当的描述符,完成后,循环并再次调用select
以等待下一个I/O事件。