如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

Posted

技术标签:

【中文标题】如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?【英文标题】:How to invoke a process sleeping on poll function by another thread in the same process with signal without killing it? 【发布时间】:2021-01-20 09:57:02 【问题描述】:

我想手动唤醒(由同一进程中的另一个线程)在 poll() 函数上休眠的线程等待任何可用的输入数据。看起来我通过发送信号找到了可能的解决方案,但我真的没有任何经验。在此页面上,我found 一个名为 SIGPOLL 的信号,其代码如 POLL_IN、POLL_MSG,但是当我调用它时,整个过程都被杀死了。 如何在不杀死整个进程的情况下发送此信号?

【问题讨论】:

如果你想通信的线程已经是polling 为什么不直接使用pipe 来通信呢? @G.M.谢谢你。还没想好。 【参考方案1】:

我使用 pipe() 来解决这个问题。

void a(int invokefd)
     ...
     write(invokefd, "c", 1);
     ...


void b(int invokefd)
     vector<pollfd> readfds;
     ...
     pollfd invfd;
     invfd.fd = invokefd;
     invfd.events = POLLIN;
     invfd.revents = 0;
     readfds.push_back(invfd);
     ...
     poll(&readfds[0], readfds.size(), -1);
     ...


void main()
     ...
     int invokedfs[2];
     pipe(invokefds);
     thread aTh(a, invokefds[1]);
     thread bTh(b, invokefds[0]);
     ...


【讨论】:

另请阅读syscalls(2)、socket(2)、unix(7)、mkfifo(3)、fifo(7)、sem_overview(7)、shm_overview(7)。考虑使用libevent、POCO、Qt

以上是关于如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?的主要内容,如果未能解决你的问题,请参考以下文章

如果线程在内核中实现,可以使用内核信号量对同一个进程中的两个线程进行同步吗?

linux下pthread_cancel无法取消线程的原因

如何将自定义事件/信号从一个进程发送到 MacOS 中的另一个进程

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

多线程,异步

一个进程如何与同一主机上的另一个进程进行身份验证和安全通信