Можно использовать:
grep -- "\<C\>" your_file
Это также будет соответствовать I like C, because...
.
Программа yes
будет записывать в конвейер одновременно с устройством чтения. Если канал пуст, считыватель заблокируется в ядре при вызове read()
, ожидая дополнительных входных данных. Если канал заполнен, запись будет заблокирована в ядре при вызове write()
, ожидая, пока читатель освободит место в канале.
Ядро отправляет сигнал SIGPIPE
процессу, если он привязывается к записи в канал, у которого нет считывателя. Когда процесс чтения закрывает считываемый -конец канала (либо явно, либо в результате его завершения ), при следующей попытке записи в канал процесс записи получит SIGPIPE
сигнал.
Чтобы проиллюстрировать это, рассмотрим упрощенную версию программы yes
, которая печатает непрерывный поток y
. Эта программа отличается от yes
тем, что генерирует сообщение, когда получает сигнал SIGPIPE
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
static void handler(int sig) {
#define msg "received SIGPIPE signal, terminating\n"
write(2, msg, sizeof msg);
exit(1);
#undef msg
}
int main(void) {
// Instruct the kernel to call the handler() function when
// this process receives the SIGPIPE signal. The default behavior
// when this signal is received is for the process to terminate.
signal(SIGPIPE, handler);
for (;;) {
if (write(1, "y\n", 2) < 0) {
fprintf(stderr, "%s\n", strerror(errno));
return 2;
}
}
return 0;
}
Я могу скомпилировать и запустить программу и увидеть, что она ведет себя какyes
:
$ gcc ex.c -o myes
$./myes
y
y
y
...
Если я передаю вывод другому процессу, когда этот процесс завершается (и конец канала для чтения -закрывается ), программа myes
получает сигнал SIGPIPE
(как указывается соответствующим сообщением ).
$./myes | head -n5
y
y
y
y
y
received SIGPIPE signal, terminating