To synchronously determine the completion of an asynchronous I/O event rather than depend on a SIGIO interrupt, use poll(2). You can also poll to determine the origin of a SIGIO interrupt.
Use of poll(2) for very large numbers of files is slow. This problem is resolved by poll(7D).