在服务器代码中,我想使用pselect来等待客户端连接以及监视我创建的prozesse的标准输出并将其发送到客户端(例如简化的远程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()创建新的prozesse(尚未实现),我知道必须在它们上进行wait()。我也可以等他们吗?我想我需要对信号SIGCHILD进行聊天,那么我将如何使用呢?子对象上的wait()也会阻塞,或者我可以偷看一下然后继续进行pselect,否则我必须并发阻塞等待。
最佳答案
它立即返回,因为writers
集中的文件描述符已准备好。标准输出流几乎总是准备好进行写入。
并且,如果您检查select
manual page,您将看到返回值是错误时为-1
,超时时为0
,以及一个正数,它告诉您准备好的文件描述符的数量。
关于c++ - 使用pselect进行同步等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16207286/