Что произойдет, если передать «да» другой команде?

Можно использовать:

grep -- "\<C\>" your_file

Это также будет соответствовать I like C, because....

0
30.03.2020, 04:46
1 ответ

Программа 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
3
19.03.2021, 02:31

Теги

Похожие вопросы