Єдине, що у вашому питанні не стоїть як неправильне - це ви сказали
Спочатку біжить A, тоді B отримує відтінок A
Насправді обидві програми будуть запускатися майже в один і той же час. Якщо для B
спроби читання немає вводу , він блокується, поки не буде введення для читання. Так само, якщо нікого не читає вихід з нього A
, його запис блокується, поки його вихід не буде прочитаний (частина його буде забудована трубою).
Єдине, що синхронізує процеси, які беруть участь у трубопроводі, - це введення-виведення, тобто читання та запис по трубі. Якщо жодного письма чи читання не відбувається, то два процеси працюватимуть абсолютно незалежно один від одного. Якщо хтось ігнорує читання або запис іншого, ігнорований процес блокується і в кінцевому підсумку буде вбитий SIGPIPE
сигналом (якщо він пише) або отримає стан закінчення файлу у своєму стандартному потоці введення (якщо читання), коли інший процес припиняється .
Ідіоматичний спосіб описати A | B
- це трубопровід, що містить дві програми. Вихід, отриманий на стандартному виході з першої програми, доступний для зчитування на стандартному вході другою ("[висновок] A
вводиться у [вхід]] B
). Раковина робить необхідну сантехніку, щоб це могло статися.
Якщо ви хочете вживати слова "споживач" та "виробник", я вважаю, що це теж нормально.
Те, що це програми, написані на С, не має значення. Те, що це Linux, macOS, OpenBSD або AIX, не має значення.