@@ -850,10 +850,11 @@ added: v0.1.13
850850
851851* `code` {Integer} The exit code. Defaults to `0`.
852852
853- The `process.exit()` method instructs Node.js to terminate the process as
854- quickly as possible with the specified exit `code`. If the `code` is omitted,
855- exit uses either the 'success' code `0` or the value of `process.exitCode` if
856- specified.
853+ The `process.exit()` method instructs Node.js to terminate the process
854+ synchronously with an exit status of `code`. If `code` is omitted, exit uses
855+ either the 'success' code `0` or the value of `process.exitCode` if it has been
856+ set. Node.js will not terminate until all the [`'exit'`] event listeners are
857+ called.
857858
858859To exit with a 'failure' code:
859860
@@ -886,7 +887,7 @@ if (someConditionNotMet()) {
886887```
887888
888889The reason this is problematic is because writes to `process.stdout` in Node.js
889- are sometimes *non-blocking * and may occur over multiple ticks of the Node.js
890+ are sometimes *asynchronous * and may occur over multiple ticks of the Node.js
890891event loop. Calling `process.exit()`, however, forces the process to exit
891892*before* those additional writes to `stdout` can be performed.
892893
@@ -1475,23 +1476,11 @@ Android)
14751476
14761477* {Stream}
14771478
1478- The `process.stderr` property returns a [Writable][] stream equivalent to or
1479- associated with `stderr` (fd `2`).
1479+ The `process.stderr` property returns a [Writable][] stream connected to
1480+ `stderr` (fd `2`).
14801481
1481- Note: `process.stderr` and `process.stdout` differ from other Node.js streams
1482- in several ways:
1483- 1. They cannot be closed ([`end()`][] will throw).
1484- 2. They never emit the [`'finish'`][] event.
1485- 3. Writes _can_ block when output is redirected to a file.
1486- - Note that disks are fast and operating systems normally employ write-back
1487- caching so this is very uncommon.
1488- 4. Writes on UNIX **will** block by default if output is going to a TTY
1489- (a terminal).
1490- 5. Windows functionality differs. Writes block except when output is going to a
1491- TTY.
1492-
1493- To check if Node.js is being run in a TTY context, read the `isTTY` property
1494- on `process.stderr`, `process.stdout`, or `process.stdin`:
1482+ Note: `process.stderr` differs from other Node.js streams in important ways,
1483+ see [note on process I/O][] for more information.
14951484
14961485## process.stdin
14971486
@@ -1529,48 +1518,59 @@ must call `process.stdin.resume()` to read from it. Note also that calling
15291518
15301519* {Stream}
15311520
1532- The `process.stdout` property returns a [Writable][] stream equivalent to or
1533- associated with `stdout` (fd `1 `).
1521+ The `process.stdout` property returns a [Writable][] stream connected to
1522+ `stdout` (fd `2 `).
15341523
1535- For example:
1524+ For example, to copy process.stdin to process.stdout :
15361525
15371526```js
1538- console.log = (msg) => {
1539- process.stdout.write(`${msg}\n`);
1540- };
1527+ process.stdin.pipe(process.stdout);
15411528```
15421529
1543- Note: `process.stderr` and `process.stdout` differ from other Node.js streams
1544- in several ways:
1545- 1. They cannot be closed ([`end()`][] will throw).
1546- 2. They never emit the [`'finish'`][] event.
1547- 3. Writes _can_ block when output is redirected to a file.
1548- - Note that disks are fast and operating systems normally employ write-back
1549- caching so this is very uncommon.
1550- 4. Writes on UNIX **will** block by default if output is going to a TTY
1551- (a terminal).
1552- 5. Windows functionality differs. Writes block except when output is going to a
1553- TTY.
1530+ Note: `process.stdout` differs from other Node.js streams in important ways,
1531+ see [note on process I/O][] for more information.
1532+
1533+ ### A note on process I/O
15541534
1555- To check if Node.js is being run in a TTY context, read the `isTTY` property
1556- on `process.stderr`, `process.stdout`, or `process.stdin` :
1535+ `process.stdout` and `process.stderr` differ from other Node.js streams in
1536+ important ways :
15571537
1558- ### TTY Terminals and `process.stdout`
1538+ 1. They are used internally by [`console.log()`][] and [`console.error()`][],
1539+ respectively.
1540+ 2. They cannot be closed ([`end()`][] will throw).
1541+ 3. They will never emit the [`'finish'`][] event.
1542+ 4. Writes may be synchronous depending on the what the stream is connected to
1543+ and whether the system is Windows or Unix:
1544+ - Files: *synchronous* on Windows and Linux
1545+ - TTYs (Terminals): *asynchronous* on Windows, *synchronous* on Unix
1546+ - Pipes (and sockets): *synchronous* on Windows, *asynchronous* on Unix
15591547
1560- The `process.stderr` and `process.stdout` streams are blocking when outputting
1561- to TTYs (terminals) on OS X as a workaround for the operating system's small,
1562- 1kb buffer size. This is to prevent interleaving between `stdout` and `stderr`.
1548+ These behaviours are partly for historical reasons, as changing them would
1549+ create backwards incompatibility, but they are also expected by some users.
15631550
1564- To check if Node.js is being run in a [TTY][] context, check the `isTTY`
1565- property on `process.stderr`, `process.stdout`, or `process.stdin`.
1551+ Synchronous writes avoid problems such as output written with `console.log()` or
1552+ `console.write()` being unexpectedly interleaved, or not written at all if
1553+ `process.exit()` is called before an asynchronous write completes. See
1554+ [`process.exit()`][] for more information.
1555+
1556+ ***Warning***: Synchronous writes block the event loop until the write has
1557+ completed. This can be near instantaneous in the case of output to a file, but
1558+ under high system load, pipes that are not being read at the receiving end, or
1559+ with slow terminals or file systems, its possible for the event loop to be
1560+ blocked often enough and long enough to have severe negative performance
1561+ impacts. This may not be a problem when writing to an interactive terminal
1562+ session, but consider this particularly careful when doing production logging to
1563+ the process output streams.
1564+
1565+ To check if a stream is connected to a [TTY][] context, check the `isTTY`
1566+ property.
15661567
15671568For instance:
15681569```console
15691570$ node -p "Boolean(process.stdin.isTTY)"
15701571true
15711572$ echo "foo" | node -p "Boolean(process.stdin.isTTY)"
15721573false
1573-
15741574$ node -p "Boolean(process.stdout.isTTY)"
15751575true
15761576$ node -p "Boolean(process.stdout.isTTY)" | cat
@@ -1724,6 +1724,7 @@ cases:
17241724 the high-order bit, and then contain the value of the signal code.
17251725
17261726
1727+ [`'exit'`]: #process_event_exit
17271728[`'finish'`]: stream.html#stream_event_finish
17281729[`'message'`]: child_process.html#child_process_event_message
17291730[`'rejectionHandled'`]: #process_event_rejectionhandled
@@ -1745,6 +1746,7 @@ cases:
17451746[`promise.catch()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch
17461747[`require.main`]: modules.html#modules_accessing_the_main_module
17471748[`setTimeout(fn, 0)`]: timers.html#timers_settimeout_callback_delay_args
1749+ [note on process I/O]: process.html#process_a_note_on_process_i_o
17481750[process_emit_warning]: #process_process_emitwarning_warning_name_ctor
17491751[process_warning]: #process_event_warning
17501752[Signal Events]: #process_signal_events
0 commit comments