Единственное, что в вашем вопросе выделяется как неправильное , это то, что вы говорите
A would run first, then B gets the stdout of A
На самом деле обе программы будут запускаться почти одновременно. Если нет ввода для B
, когда он пытается прочитать, он будет блокироваться до тех пор, пока не будет ввода для чтения. Точно так же, если никто не читает вывод из A
, его записи будут блокироваться до тех пор, пока его вывод не будет прочитан (, некоторые из них будут буферизированы каналом ).
Единственное, что синхронизирует процессы, участвующие в конвейере, — это ввод-вывод, то есть чтение и запись по конвейеру. Если записи или чтения не происходит, то эти два процесса будут выполняться полностью независимо друг от друга. Если один игнорирует чтение или запись другого, игнорируемый процесс блокируется и в конечном итоге уничтожается сигналом SIGPIPE
(, если он записывает )или получает условие конца -из -файла на своем стандартном входной поток (, если читается ), когда другой процесс завершается.
Идиоматический способ описать A | B
состоит в том, что это конвейер, содержащий две программы. Вывод, произведенный на стандартном выходе из первой программы, доступен для чтения на стандартном вводе второй ("[вывод] A
передается в [вход] B
" ). Оболочка выполняет необходимую сантехнику, чтобы это произошло.
Если вы хотите использовать слова «потребитель» и «производитель», думаю, это тоже нормально.
Тот факт, что это программы, написанные на C, значения не имеет.То, что это Linux, macOS, OpenBSD или AIX, значения не имеет.
Согласно руководствуiptables
, опция -d
(, а также ряд других опций )могут иметь префикс с необязательным символом !
. Это сводит на нет смысл теста.
\
перед !
является одной из оболочек (большинства оболочек, )заключающих в кавычки/экранирующих операторов. \!
здесь будет таким же, как '!'
или "!"
.
Символ !
не нужно экранировать в большинстве распространенных оболочек, поскольку он сам по себе не является особенным, когда является частью аргументов команды, так что \
здесь излишен. Независимо от того, используется ли \!
, "!"
, '!'
или !
, литеральный аргумент !
будет передан в iptables
.