select不保存文件描述符

时间:2013-08-11 10:14:16

标签: c file-descriptor

昨天我发现了select,这是一个非常有用的工具,但我无法让它发挥作用。这是我总代码的一部分:

/* Code here */
FD_ZERO(&fifo_set);
printf("%d\n", num_proc);
for(i = 0; i < num_proc; ++i)
    FD_SET(proc[i].fifowfd, &fifo_set);

/* More code here */
while(1)
{
    if(select(FD_SETSIZE, &fifo_set, NULL, NULL, NULL) < 0)
    {
        log_event(5, "Could not block.");
        exit(1);
    }
    printf("FD_SETSIZE: %d\n", FD_SETSIZE);
    for(i = 0; i < FD_SETSIZE; ++i)
        printf("ISSET %d: %d\n", i, FD_ISSET(i,&fifo_set));

    log_event(1, "Actions to be done.");
/* More code */

数组proc是一个进程数组,给定它的PID,以及读写FIFO。检查FIFO的文件描述符,并且它们是有效的。 问题是:有3个进程(num_proc),其中fifowfd值为5,7和9.但是当我打印所有FD_ISSET时,只有5个似乎已注册并拥有数据,但这三个都有数据。 FD_SETSIZE的值为1024。

正如@mux指出的那样,这个FIFO被命名为“FIFO for writing”。问题是,我有一堆“name.r.fifo”和“name.w.fifo”,它们代表了“读取/写入的FIFO”。我正在显示的代码是来自控制器的代码,它读入“.w.fifo”,并写入“.r.fifo”。

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

select()的第一个参数是编号最大的文件描述符加1:

select(highest_fd+1, &fifo_set, NULL, NULL, NULL);

注意:fd集将包含select返回后“就绪”的描述符,如果你想再做一次,你应该再次设置fds select()

答案 1 :(得分:2)

如果调用select时所有描述符都没有数据,它将阻塞,直到至少有一个描述符准备好读取。也许,描述符5是第一个要检查的,并且在其他管道有任何数据要读之前选择退出。

您还应该检查select的实际结果,因为它包含它设置的位数。