-1

在服务器代码中,我想使用 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() 也会阻塞,或者我可以只看一眼然后继续 pselect,否则我必须并发阻塞等待。

4

1 回答 1

1

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

如果您查看select手册页,您将看到返回值是-1错误、0超时和一个正数,告诉您准备好的文件描述符的数量。

于 2013-04-25T05:54:35.937 回答