在cygwin上选择FD_ISSET的问题

时间:2013-04-25 18:03:30

标签: sockets select cygwin signals

我正在运行cygwin并使用pselect监视子进程的套接字和文件描述符。

根据我在这里找到的一些例子http://www.linuxprogrammingblog.com/code-examples/using-pselect-to-avoid-a-signal-race,手册页pselect应该返回在掩码字段(http://linux.die.net/man/2/pselect)中设置的文件描述符的数量。

现在当我连接到我的服务器时,pselect返回,这很好。但是当我使用FD_ISSET测试文件描述符时,它们总是返回true:

FD_ZERO(&readers);
FD_ZERO(&writers);
FD_ZERO(&exceptions);

FD_SET(fileno(stdin), &readers);
FD_SET(socket, &readers);
pret = pselect(FD_SETSIZE, &readers, &writers, &exceptions, NULL, &mSignalMask);

,& readers,& writers,& exceptions,NULL,& mSignalMask);

if(pret <= 0)
{
    // ignore for now
    continue;
}

if(FD_ISSET(fileno(stdin), &readers))
{
    string s;
    cin >> s;
    cout << "stdin: " << s << endl;  // blocks because the code always gets here even when 
                // pselect returns because of a childsignal without any data.
    continue;
 }

if(FD_ISSET(socket, &readers))
{
    accept();   // blocks because the code always gets here even when 
                // pselect returns because of a childsignal without any data.
    cout << "task created connection from " <<task->getClientHost() << endl;
    continue;
}

1 个答案:

答案 0 :(得分:1)

自己发现问题。如果pselect的结果是&gt;,则只能使用FD_ISSET。 0,其他来自FD_ISSET的返回值与调用之前一样。因此,当pselect返回&lt; = 0;

时,最好将其视为未定义