使用pselect进行同步等待
Using pselect for synchronous wait
在服务器代码中,我想使用pselect来等待客户端连接,并监视我创建的进程的标准输出并将其发送给客户端(如简化的远程shell)。
我试图找到如何使用pselect的例子,但我没有找到任何。客户端可以连接的套接字已经建立并工作,正如我使用accept()验证的那样。SIGTERM被阻塞
下面是我尝试使用pselect的代码:waitClient()
{
fd_set readers;
fd_set writers;
fd_set exceptions;
struct timespec ts;
// Loop until we get a sigterm to shutdown
while(getSigTERM() == false)
{
FD_ZERO(&readers);
FD_ZERO(&writers);
FD_ZERO(&exceptions);
FD_SET(fileno(stdin), &readers);
FD_SET(fileno(stdout), &writers);
FD_SET(fileno(stderr), &writers);
FD_SET(getServerSocket()->getSocketId(), &readers);
//FD_SET(getServerSocket()->getSocketId(), &writers);
memset(&ts, 0, sizeof(struct timespec));
pret = pselect(FD_SETSIZE, &readers, &writers, &exceptions, &ts, &mSignalMask);
// Here pselect always returns with 2. What does this mean?
cout << "pselect returned..." << pret << endl;
cout.flush();
}
}
所以我想知道的是如何使用pselect等待,直到收到事件,因为目前pselect总是立即返回值2。我尝试将超时设置为NULL,但这不会改变任何东西。
pselect的返回值(如果为正)是引起事件的文件描述符?
我正在使用fork()来创建新的进程(尚未实现),我知道我必须等待()。我也可以伺候他们吗?我想我需要捕捉SIGCHILD信号,那么我该如何使用它呢?wait()在子进程上也会阻塞,或者我可以只做一个peek,然后继续使用pselect,否则我必须并发阻塞等待。
它立即返回,因为writers
集中的文件描述符已经准备好了。标准输出流几乎总是可以写入的。
如果您检查select
手册页,您将看到返回值是-1
(错误),0
(超时)和一个正数,告诉您准备好的文件描述符的数量。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何在qt中同步应用程序和显示器的刷新率?
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- Windows 进程间同步类似事件?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 在 UWP 应用程序中,future.wait() 在尝试同步来自异步方法的响应时继续等待
- 线程同步:等待两个bool变量
- 同步对象以等待而不阻止C++中的 UI(C++生成器)
- 简单的多线程帮助?C++、等待单一对象和同步
- 视觉提升 条件变量中的同步队列C++不通知其他线程上的等待类方法
- Qt5中存在哪些同步原语,允许我在单个线程中等待信号到达
- 使用pselect进行同步等待
- c++同步定时等待