As I explained in the previous article, Unix-like operating systems, for instance, OS X and Linux, use LF (line feed, 0x0A
, \n
) as the newline character which moves the cursor to the beginning of the next line. However, the standard-defined behavior of LF only moves the cursor down to the next line, not to the beginning of the line. This difference is acceptable if files are always accessed through operating system-dependent applications. However, Unix-like systems have no distinction between files and input/output; this difference can be problematic when file and process input/output interact.
To handle this difference, a terminal emulator post-processes the output appropriately. The c_oflag
in the termios
structure defined by the POSIX.1 standard controls this. The c_oflag
is a flag for what post-processing the terminal should perform before displaying the received characters.
The most important flag in c_oflag
is OPOST
. This flag determines whether or not to post-process the input; if the OPOST
flag is turned off, the terminal displays the received string as-is, regardless of other flags. In other words, the output stream enters raw mode. Turning this flag off is rare. However, it is a good idea to turn it off when using the terminal for purposes other than displaying text, such as transmitting binary data.
The flag that allows terminals to operate as desired in Unix-like operating systems is ONLCR
. When ONLCR
is on, the terminal interprets NL as CRNL during output. In other words, even in Unix-like systems, if ONLCR
is off, when encountering an LF, the cursor moves to the next line in the current position instead of the beginning of the next line. In Unix-like operating systems, when you need to display a file created in Windows, you can easily display it by turning off the ONLCR
flag without converting CRNL to NL.
In addition, there are various flags, such as OCRNL
which makes the terminal behave like an old Mac OS, and XTABS
which converts a tab character (0x09
, \t
) into the appropriate number of spaces. Through these flags, developers can have fine control over terminal output and unify the behavior when developing terminal-based applications, ignoring the differences between operating systems.
Comments
Post a Comment