使用pselect进行同步等待

时间:2013-04-25 05:50:15

标签: c++ c sockets posix

在服务器代码中,我想使用pselect等待客户端连接以及监视我创建的prozesses的标准输出并将其发送到客户端(如简化的远程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()创建新的prozesses(尚未实现)我知道我必须等待()。我也可以等他们吗?我想我需要聊聊信号SIGCHILD,那我该如何使用呢?对孩子的wait()也会阻止,或者我可以偷看然后继续pselect,否则我必须同时阻止等待。

1 个答案:

答案 0 :(得分:1)

它会立即返回,因为writers集中的文件描述符已准备就绪。标准输出流几乎总是可以写入。

如果您检查select manual page,您会看到错误时返回值为-1,超时时返回0,并且正数表示文件描述符的数量准备好了。