Qt を使用して、stdin ストリームの内容をノンブロッキングで読み取ろうとしています。QSocketNotifier を使用して、ソケットが新しいデータを受信したときに警告します。通知機能のセットアップは次のようになります。
QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
スロットは次のonData()
ようになります。
void CIPCListener::onData()
{
qDebug() << Q_FUNC_INFO;
QTextStream stream(stdin, QIODevice::ReadOnly);
QString str;
forever
{
fd_set stdinfd;
FD_ZERO( &stdinfd );
FD_SET( STDIN_FILENO, &stdinfd );
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
int ready = select( 1, &stdinfd, NULL, NULL, &tv );
if( ready > 0 )
{
str += stream.readLine();
}
else
{
break;
}
}
qDebug() << "Recieved data:" << str;
}
ご覧のとおり、select() システム コールを使用して、読み取るデータがなくなったことを知らせようとしています。ただし、実際には、テキストの最初の行を読んだ後に select() 呼び出しが 0 を返します。したがって、たとえば、プロセスの stdin ストリームに 5 行のテキストを書き込むと、最初の行しか読み取れません。
何が問題なのですか?