Given a command, e.g., "codice_36", the shell creates a pipe, then starts both codice_37 and codice_38 with stdio for the two commands redirected so that codice_37 writes its stdout into the input of the pipe while codice_38 reads stdin from the output of the pipe. Pipes are implemented by the operating system with a certain amount of buffering so that codice_37 can write for a while before the pipe fills but once the pipe fills any new write will block inside the OS until codice_38 reads enough to unblock new writes. If codice_38 tries to read more data than is available, it will block until codice_37 has written more data or until the pipe closes, e.g., if codice_37 exits.