昨天我发现了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),它的值为5、7和9。但是当我打印所有的FD_ISSET时,似乎只有5被注册并且有数据,但是这三个进程都有数据。FD_SETSIZE的值为1024。
正如@mux所指出的,这个FIFO被命名为"FIFO表示写入“。问题是,我有一堆"name.r.fifo“和"name.w.fifo",它们从进程的侧面表示"FIFO用于读写”。我展示的代码是来自控制器的代码,控制器读取".w.fifo",并写入".r.fifo“。
我是不是遗漏了什么?
发布于 2013-08-11 02:29:55
select()
的第一个参数是编号最高的文件描述符+ 1:
select(highest_fd+1, &fifo_set, NULL, NULL, NULL);
注意: fd集将包含选择返回后的“就绪”描述符,如果要执行另一个select()
,则应该再次设置fds。
发布于 2013-08-11 02:40:00
如果调用select时所有描述符都没有数据,那么它将被阻塞,直到至少有一个描述符可以读取。可能,描述符5是第一个被检查并在其他管道读取任何数据之前选择出口的对象。
您还应该检查select的实际结果,因为它包含它设置的位数。
https://stackoverflow.com/questions/18170871
复制