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/

相关文章:

使用 sha256 和检查内存中的 Linux 内核代码

php - 是否有实用程序可以将 POSIX 转换为适用于 PHP 的 PCRE?

linux - Java 8 Javadoc 与 XJC 警告和错误

Linux ipconfig命令

python-3.x - 如何将数据写入 Python shell 管道中第一个进程的标准输入?

Java时间忽略夏令时规则

无法从打开的文件中读取

c - 如何从多线程并行的函数中获取一个正确的值

c++ - Makefile 查找 Windows 中所有 *.cpp 和 *.h 文件中断

linux - 使用 sshpass 时如何转义单引号