One common use is to drive hardware directly, either to learn how it works (prior to e.g. writing a linux device driver) or just for performance reasons. Reading and writing bits to a parallel port takes about 1us or so; there's no latency involved (no USB polling for instance), and no hoops to jump through (e.g. iopl()/mmap ) to access the hardware.