我有一个阻塞recv()
循环的线程,我想终止(假设这不能改为select()
或任何其他异步方法).
我还有一个捕获的信号处理程序,SIGINT
理论上它应该recv()
返回错误并errno
设置为EINTR
.
但它没有,我认为这与应用程序是多线程的事实有关.还有另一个线程,同时在等待pthread_join()
通话.
这里发生了什么事?
编辑:
好的,现在我recv()
通过pthread_kill()
主线程明确地将信号传递给所有阻塞线程(这导致SIGINT
安装了相同的全局信号处理程序,尽管多次调用是良性的).但recv()
呼叫仍然没有被阻止.
编辑:
我编写了一个代码示例来重现问题.
SIGINT
.SIGUSR1
.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)