select()调用中的第一个参数应该是编号最大的文件描述符加1,而不是fd_set中的文件描述符数 .
以下是我为解决此问题所做的更改:
--- fifotest-1.c 2009-05-22 23:44:03.000000000 -0400
+++ fifotest.c 2009-05-22 23:34:00.000000000 -0400
@@ -34,19 +34,22 @@
sim_arg_t* ifs = arg;
uint32_t num_ifs;
uint32_t select_len;
+ int maxfd;
num_ifs = ifs->num_ifs;
while (num_ifs > 0) {
FD_ZERO (&set);
select_len = 0;
- for (i = 0; i < ifs->num_ifs; ++i) {
+ for (maxfd=0, i = 0; i < ifs->num_ifs; ++i) {
if (ifs->if_list[i].valid) {
FD_SET(ifs->if_list[i].fh, &set);
- ++select_len;
+ if (ifs->if_list[i].fh > maxfd)
+ maxfd = ifs->if_list[i].fh;
+ select_len++;
}
}
printf("Waiting on %d file descriptors\n", select_len);
- ret = select(select_len, &set, NULL, NULL, NULL);
+ ret = select(maxfd+1, &set, NULL, NULL, NULL);
if (ret < 0) {
fprintf(stderr, "Select returned error!\n");
continue;