Standard input – this is the file handle that your process reads to get information from you.
Standard output – your process writes conventional output to this file handle.
Standard error – your process writes diagnostic output to this file handle.
That’s about as dumbed-down as I can make it 🙂
Of course, that’s mostly by convention. There’s nothing stopping you from writing your diagnostic information to standard output if you wish. You can even close the three file handles totally and open your own files for I/O.
When your process starts, it should already have these handles open and it can just read from and/or write to them.
By default, they’re probably connected to your terminal device (e.g.,
/dev/tty) but shells will allow you to set up connections between these handles and specific files and/or devices (or even pipelines to other processes) before your process starts (some of the manipulations possible are rather clever).
An example being:
my_prog <inputfile 2>errorfile | grep XYZ
- create a process for
inputfileas your standard input (file handle 0).
errorfileas your standard error (file handle 2).
- create another process for
- attach the standard output of
my_progto the standard input of
Re your comment:
When I open these files in /dev folder, how come I never get to see the output of a process running?
It’s because they’re not normal files. While UNIX presents everything as a file in a file system somewhere, that doesn’t make it so at the lowest levels. Most files in the
/dev hierarchy are either character or block devices, effectively a device driver. They don’t have a size but they do have a major and minor device number.
When you open them, you’re connected to the device driver rather than a physical file, and the device driver is smart enough to know that separate processes should be handled separately.
The same is true for the Linux
/proc filesystem. Those aren’t real files, just tightly controlled gateways to kernel information.