使用pselect进行同步等待
问题描述:
在服务器代码中,我希望使用pselect等待客户端连接以及监视我创建的标准输出并将其发送到客户端(如简化的远程shell)。使用pselect进行同步等待
我试图找到如何使用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(如果为positive)的返回值是导致该事件的filedescriptor?我使用fork()来创建新的prozesses(尚未实现)我知道我必须等待()他们。我可以等他们吗?我想我需要聊天信号SIGCHILD,那么我将如何使用它? wait()对孩子也会阻塞,或者我可以只查看一下,然后继续pselect,否则我不得不同时阻塞等待。
答
它会立即返回,因为writers
集中的文件描述符已准备就绪。标准输出流几乎总是准备好写入。
如果您检查select
manual page,您将看到错误返回值为-1
,超时时为0
,正数告诉您准备好的文件描述符的数量。
因此,无论如何等待作家是没有意义的。还是仅限于插座上的作者? – Devolus 2013-04-25 07:15:41
@Devolus除非您在套接字上发送大量数据,否则写入调用将不可能被阻止。我发现在大多数情况下写入集合并不是没有用,因为其中的描述符无论如何都将准备就绪。 – 2013-04-25 07:19:24
谢谢。我昨天整天都在Google上搜索,但我没有找到非常清楚的描述。 – Devolus 2013-04-25 07:32:56