相关疑难解决方法(0)

recv()不会被多线程环境中的信号中断

我有一个阻塞recv()循环的线程,我想终止(假设这不能改为select()或任何其他异步方法).

我还有一个捕获的信号处理程序,SIGINT理论上它应该recv()返回错误并errno设置为EINTR.

但它没有,我认为这与应用程序是多线程的事实有关.还有另一个线程,同时在等待pthread_join()通话.

这里发生了什么事?

编辑:

好的,现在我recv()通过pthread_kill()主线程明确地将信号传递给所有阻塞线程(这导致SIGINT安装了相同的全局信号处理程序,尽管多次调用是良性的).但recv()呼叫仍然没有被阻止.

编辑:

我编写了一个代码示例来重现问题.

  1. 主线程将套接字连接到不会让连接进入的行为不当的远程主机.
  2. 所有信号都被封锁
  3. 读线程线程已启动.
  4. 主要解锁和安装处理程序SIGINT.
  5. 读线程解锁并安装处理程序SIGUSR1.
  6. 主线程的信号处理程序将a发送SIGUSR1到读取线程.

有趣的是,如果我取代recv()sleep()被中断就好了.

PS

或者,您只需打开UDP套接字而不是使用服务器.

客户

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>

static void
err(const char *msg)
{ …
Run Code Online (Sandbox Code Playgroud)

c sockets linux signals pthreads

17
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×1

linux ×1

pthreads ×1

signals ×1

sockets ×1