如何使用stdout选择?

我有以下代码

fd_set set; struct timeval timeout; printf("first printf\n"); // displayed FD_ZERO(&set); timeout.tv_sec = 1; FD_SET(fileno(stdout), &set); if (select(FD_SETSIZE, NULL, &set, NULL, &timeout)!=1) { stdout_closed = true; return; } printf("second printf\n"); // Not displayed 

我试图在printf("second printf\n");之前检查写入stdout的能力printf("second printf\n"); 。 但是使用此代码,select返回一个值!= 1然后printf保持不可缓存。 看起来像选择返回“ 不可能 ”写入标准输出。

你能解释一下这种行为吗?

对select()的调用返回-1,而errno是22(无效参数),因为你在超时中有垃圾值。 试试这个:

 FD_ZERO(&set); timeout.tv_sec = 1; timeout.tv_usec = 0; /* ADD THIS LINE to initialize tv_usec to 0 so it's valid */ 

它应该工作。