昨天我发现了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”。
我错过了什么吗?
答案 0 :(得分:2)
select()
的第一个参数是编号最大的文件描述符加1:
select(highest_fd+1, &fifo_set, NULL, NULL, NULL);
注意:fd集将包含select返回后“就绪”的描述符,如果你想再做一次,你应该再次设置fds select()
答案 1 :(得分:2)
如果调用select时所有描述符都没有数据,它将阻塞,直到至少有一个描述符准备好读取。也许,描述符5是第一个要检查的,并且在其他管道有任何数据要读之前选择退出。
您还应该检查select的实际结果,因为它包含它设置的位数。