[doc/io] Add a warning about process blocking behavior

Bug:https://github.com/dart-lang/sdk/issues/50674
Change-Id: I770527b41260250f1badba3a4387029bb68888af
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/276621
Commit-Queue: Brian Quinlan <bquinlan@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index aacdb79..e5160ad 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -216,6 +216,25 @@
 /// A `Process`'s streams are distinct from the top-level streams
 /// for the current program.
 ///
+/// **NOTE:**
+/// `stdin`, `stdout`, and `stderr` are implemented using pipes between
+/// the parent process and the spawned subprocess. These pipes have limited
+/// capacity. If the subprocess writes to stderr or stdout in excess of that
+/// limit without the output being read, the subprocess blocks waiting for
+/// the pipe buffer to accept more data. For example:
+///
+/// ```dart
+/// import 'dart:io';
+///
+/// main() async {
+///   var process = await Process.start('cat', ['largefile.txt']);
+///   // The following await statement will never complete because the
+///   // subprocess never exits since it is blocked waiting for its
+///   // stdout to be read.
+///   await process.stderr.forEach(print);
+/// }
+/// ```
+///
 /// ## Exit codes
 ///
 /// Call the [exitCode] method to get the exit code of the process.
@@ -413,9 +432,47 @@
       [ProcessSignal signal = ProcessSignal.sigterm]);
 
   /// The standard output stream of the process as a `Stream`.
+  ///
+  /// **NOTE:**
+  /// `stdin`, `stdout`, and `stderr` are implemented using pipes between
+  /// the parent process and the spawned subprocess. These pipes have limited
+  /// capacity. If the subprocess writes to stderr or stdout in excess of that
+  /// limit without the output being read, the subprocess blocks waiting for
+  /// the pipe buffer to accept more data. For example:
+  ///
+  /// ```dart
+  /// import 'dart:io';
+  ///
+  /// main() async {
+  ///   var process = await Process.start('cat', ['largefile.txt']);
+  ///   // The following await statement will never complete because the
+  ///   // subprocess never exits since it is blocked waiting for its
+  ///   // stdout to be read.
+  ///   await process.stderr.forEach(print);
+  /// }
+  /// ```
   Stream<List<int>> get stdout;
 
   /// The standard error stream of the process as a `Stream`.
+  ///
+  /// **NOTE:**
+  /// `stdin`, `stdout`, and `stderr` are implemented using pipes between
+  /// the parent process and the spawned subprocess. These pipes have limited
+  /// capacity. If the subprocess writes to stderr or stdout in excess of that
+  /// limit without the output being read, the subprocess blocks waiting for
+  /// the pipe buffer to accept more data. For example:
+  ///
+  /// ```dart
+  /// import 'dart:io';
+  ///
+  /// main() async {
+  ///   var process = await Process.start('cat', ['largefile.txt']);
+  ///   // The following await statement will never complete because the
+  ///   // subprocess never exits since it is blocked waiting for its
+  ///   // stdout to be read.
+  ///   await process.stderr.forEach(print);
+  /// }
+  /// ```
   Stream<List<int>> get stderr;
 
   /// The standard input stream of the process as an [IOSink].