External device interrupts are implemented with SIGIO. The drivers arrange that whenever input arrives, a SIGIO is generated. The SIGIO handler figures out (currently using select) which file descriptors have waiting input, and from that determines what IRQ is associated with each descriptor. At that point, it calls into the standard IRQ code in order to handle the interrupt.