使用pselect进行同步等待

Using pselect for synchronous wait

本文关键字:同步 等待 pselect 使用      更新时间:2023-10-16

在服务器代码中,我想使用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(超时)和一个正数,告诉您准备好的文件描述符的数量。