Macos 管道并选择:示例代码不工作

Macos 管道并选择:示例代码不工作,macos,select,pipe,Macos,Select,Pipe,我错过什么了吗 我想通过在另一个线程中调用write来退出select。。。它永远不会出自精选 代码在OSX snow上进行了测试 威斯康星州里约热内卢 int-pfd[2] 无效测试(int睡眠时间) { 睡眠(睡眠时间) } int main(int argc,char*argv[]) { charbuff[80]; int=0; 管道(pfd); FD_ZERO和rio; FD_零(&wio); FD_集(pfd[1],&wio); FD_集(pfd[0],&rio); pthread\u

我错过什么了吗

我想通过在另一个线程中调用write来退出select。。。它永远不会出自精选

代码在OSX snow上进行了测试

威斯康星州里约热内卢

int-pfd[2]

无效测试(int睡眠时间)
{
睡眠(睡眠时间)

}

int main(int argc,char*argv[])

{

charbuff[80];
int=0;
管道(pfd);
FD_ZERO和rio;
FD_零(&wio);
FD_集(pfd[1],&wio);
FD_集(pfd[0],&rio);
pthread\u t tid;/*线程标识符*/
pthread\u attr\u t attr;/*线程属性集*/
pthread_attr_init(&attr);
pthread_create(tid,NULL,test,3);
当(!结束)
{
//检查我的号码…他们不超过1…所以2
如果(选择(2,&rio,&wio,NULL,0)<0)
佩罗(“选择”);
其他的
{
if(FD_ISSET(pfd[1],&wio))
{

如果((读取(pfd[0],&buff,80))我相信您有两个错误:

1-您的select调用将检查限制为最大fd 2,其中管道可能具有较大的fd,因为0、1和2已为stdin、stdout、stderr打开。管道fd可能具有fd 3和fd 4,因此您实际上需要确定2个管道fd中的较大者,并将其用于select中的限制,而不是2

int maxfd = pfd[1];
if( pfd[0] > maxfd ) {
    maxfd = pfd[0];
}
...
2-select返回后,您需要查看wio和管道写入FD,以查看是否有可读取的内容:

        if (FD_ISSET(pfd[0], &rio)) {
int maxfd = pfd[1];
if( pfd[0] > maxfd ) {
    maxfd = pfd[0];
}
...
        if (FD_ISSET(pfd[0], &rio)) {