gpt4 book ai didi

c++ - 使用 pselect 进行同步等待

转载 作者:行者123 更新时间:2023-11-30 19:22:28 24 4
gpt4 key购买 nike

在服务器代码中,我想使用 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() 创建新的进程(尚未实现),我知道我必须对它们进行 wait() 。我也可以等他们吗?我想我需要捕获信号 SIGCHILD,那么我该如何使用它呢?子进程上的 wait() 也会阻塞,或者我可以只看一眼然后继续 pselect,否则我必须并发阻塞等待。

最佳答案

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

如果你检查 select manual page您将看到,错误时返回值为 -1,超时时返回值为 0,正数告诉您已准备就绪的文件描述符的数量。

关于c++ - 使用 pselect 进行同步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com