2013-04-25 42 views
-1

在服务器代码中,我希望使用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,否则我不得不同时阻塞等待。

回答

1

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

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

+0

因此,无论如何等待作家是没有意义的。还是仅限于插座上的作者? – Devolus 2013-04-25 07:15:41

+1

@Devolus除非您在套接字上发送大量数据,否则写入调用将不可能被阻止。我发现在大多数情况下写入集合并不是没有用,因为其中的描述符无论如何都将准备就绪。 – 2013-04-25 07:19:24

+0

谢谢。我昨天整天都在Google上搜索,但我没有找到非常清楚的描述。 – Devolus 2013-04-25 07:32:56