We have a long standing bug in our production code. This is essentially a socket based daemon. It listens to a bunch of filedescriptors using select.
Occasionally (once a day or so), select will return with EBADF.
I have written code to search for the bad filedescriptor, that loops over each fd and calls select on it. These calls never return EBADF. I also tried fstat. They also never return EBADF.
I also rewrote the daemon to use poll. This did not help.
Does anyone have some other ideas ? (apart from i made a dumb mistake, which is all to easy to do with select).
I agree with James. With poll(), you have revents per fd which can easily be checked.
I.e.
Of course you would not implement it that way in the real world, its just an example. I stopped using select() a long time ago, poll() is a much better interface. You’re correct, its just too easy to shoot yourself in the foot with select().