linux - 从另一个线程中止 read()

标签 linux posix

我的主线是这样的:

while (!shouldExit) {
   int c = getchar();
   switch (c) {
     case .... :
     case .... :
     case 'x' : shuoldExit = true; break;
   }
}

然后,有另一个线程从网络读取数据,当我收到一个特殊命令时,它会设置 shouldExit = 1。这非常有效,唯一的问题是 strace 中的 getchar() 一直阻塞在 read(0) 上。

我的工作线程如何中止主线程中的 read 系统调用?

我尝试向自己发送信号,但这只会终止应用程序(预期)。当我在空处理程序中捕获信号时,应用程序保持事件状态,但 read 保持阻塞。

一个选择可能是使用 select() ,但我对此并不满意。还有其他选择吗?

编辑: 另见这个问题,它与我的相似,但我们正在寻找不同的解决方案。他的解决方案不适用于我的问题,因为阻塞 read() 在主线程上。

aborting a blocking read on linux

最佳答案

在您要发出信号的线程上使用 pthread_kill()。不要使用 kill();就此而言,既然你链接到了它,就不要使用 signal() ——它是一种更迟钝的、不可移植的接口(interface):

The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below."

[ 这已在评论中得到回答,但出于某种原因仍显示在未回答问题的相关性顶部。所以在这里,为了完整起见]

关于linux - 从另一个线程中止 read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885344/

相关文章:

xml - Shell:从 XML 文件中提取特定 block

c++ - std::regex 不识别 $

c - 如何跟踪所有要清理的后代进程?

c++ - putchar_unlocked 在 C++ 14 标准中不起作用

linux - 如何在 Linux 上的 SDCARD 中写入超过 2000,000 个文件

linux - 如何将 fd 传递给另一个进程?

linux - 如何使用 Mahout kmeans 算法将集群转储到本地文件系统

Cygwin MinGW 包与独立的 MinGW

python - PATH_MAX和NAME_MAX有什么关系,如何获取?

linux - svn import 出现错误