- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想编写一个程序,在 SIGIO
上向线程池中的所有线程发出信号。我编写了以下代码,但似乎一个套接字一次只能由一个线程拥有,因此只会向线程池中的最后一个线程通知事件。有没有什么方法可以让我在不使用专用信号捕获线程并且不中断主进程的情况下获得所需的行为?
void sigFunc(int signo){
printf("SIGNAL %li!\n", gettid());
return;
}
static void* poolFunc(){
printf("Pool func... %li\n", gettid());
fcntl(lsocket, F_SETOWN, gettid());
for(;;)
sleep(1);
return NULL;
}
int main(int argc, char *argv[]){
unsigned char val;
int lsocket;
pthread_t pool[4];
lsocket = socket(AF_INET, SOCK_STREAM, 0);
// Omitted 15 lines of setting up lsocket, this part is boring
fcntl(lsocket, F_SETFL, fcntl(lsocket, F_GETFL) | O_ASYNC);
signal(SIGIO, sigFunc);
for(val=0; val < 4; val++){
if(pthread_create(&pool[val], NULL, poolFunc, NULL) != 0){
printf("Creation of thread pool failed!\n");
exit(1);
}
if(pthread_detach(pool[val]) != 0){
printf("Failed to detach thread in pool...?\n");
exit(1);
}
}
printf("Starting main loop...\n");
for(;;)
sleep(1);
}
输出:
$ ./program
Pool func... 17580
Pool func... 17582
Pool func... 17581
Pool func... 17583
Pool func... 17584
Starting main loop...
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
^C$ ./program
Pool func... 17621
Pool func... 17620
Pool func... 17623
Pool func... 17624
Pool func... 17622
Starting main loop...
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
^C
最佳答案
信号处理位于进程级别。
这意味着进程中只有一个线程会收到发送到该进程的信号。
换句话说:从进程外部只有一个进程的线程可以收到信号。
为了向进程中的所有线程发出信号,pthread_kill()
可由该进程的每个自己线程使用。为此,进程需要跟踪其所有现有(已创建且仍处于事件状态)线程。
关于c - SIGIO 只通知线程池中的最后一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44795651/
我想编写一个程序,在 SIGIO 上向线程池中的所有线程发出信号。我编写了以下代码,但似乎一个套接字一次只能由一个线程拥有,因此只会向线程池中的最后一个线程通知事件。有没有什么方法可以让我在不使用专用
我正在尝试接收串行数据,但我无法确定时间。 当接收到串行数据时,SIGIO 何时触发 - 在接收到数据的第一个字节时,还是在接收到特定字符(CR、NL...)时? 设置串行数据端口: /* Open
根据我的研究,您可以添加一个 epoll 文件描述符来轮询、选择或另一个 epoll,如果事件可用,它将返回 POLLIN。根据 epoll(7): Q3 Is the epoll file
这有点长...对于初学者,我使用的是 Linux 2.6.33,gcc 4.4.4。 我写了一个小程序,它创建一个命名管道并读取它,直到它看到一个特定的字符串,然后它摆脱 FIFO,并重新执行自己。
当文件描述符上可以进行 I/O 时,我尝试接收信号。程序在不执行 I/O 时需要执行其他操作,因此不宜使用 select(2)。 当我运行下面的示例代码时,即使标准输入上没有数据,它也会尽可能快地从处
我正在处理的 C++ 程序中遇到与 SIGIO 相关的问题。 平台:Linux 2.6.30,x86 Arch 场景:异步串行通信。 我关注了this async-communication exam
我编写了一个程序,该程序正在读取和写入一些 gpio 引脚,并使用数据报连接通过套接字接收一些数据。当收到 SIGIO 信号时,我想尝试从套接字读取数据。但是当我尝试这样做时,gpio 引脚上的读/写
在工作中,有人要求我在 Linux 上使用 C++ 为工业硬件实现一个新的 Controller 应用程序。一个关键特性是在使用 modbus 的设备之间使用 radio 调制解调器通信。我能够很好地
我正在实现一个客户端和服务器,它们使用sendto() 和recvfrom() 通过UDP 进行通信。我想在从服务器接收数据时为我的客户端使用 SIGPOLL 。我的问题是,在处理程序中,另一个信号到
我需要为 Linux 平台下的病人监护子系统创建一个 JNI c 库。我必须通过 USB 串行端口读取数据并写入命令。只要端口打开,设备就会以不同的频率和大小连续发送多种类型的数据。 在 Java 中
我正在尝试在文件描述符上可以进行 I/O 时接收信号。该程序在不执行 I/O 时需要执行其他操作,因此不能使用 select(2)。 当我运行下面的示例代码时,它会尽可能快地从处理程序内部打印消息,即
我正在学习 C 中的信号。我正在尝试编写一个符合 POSIX 和 ANSI 标准的程序。我希望我的程序在发生某些事情时发出信号,但 SIGIO 不是 POSIX 并且 SIGPOLL 在 POSIX
首先,当数据准备好读取时,我无法让串行设备生成 SIGIO。 我正在尝试编写一个简单的串行接口(interface),以使用 USB 转串行适配器与微型计算机进行通信。我想让这个接口(interfac
我正在使用 SIGIO 构建一个 UDP 非阻塞客户端和服务器套接字对,以促进服务器上数据的接收。这是我的情况。当客户端向我发送消息时,我会激活 SIGIO。然而,这些消息大约是。 3 个 1024
我在带有回调的异步模式下使用 ALSA (snd_async_add_pcm_handler())。每个 ALSA 的回调都是从 SIGIO 信号处理程序调用的。每个回调调用我的函数getCurren
我是一名优秀的程序员,十分优秀!