В каком работают переданные по каналу команды порядка?

Больше вероятное, Вы вводите его. В man date Вы видите, что он берет формат [MMDDhhmm[[CC]YY][.ss]]

Таким образом, вышеупомянутое считало бы 12:49 26 апреля 2005

Прямо сейчас в Техасе это 041122292011 (22:29 11 апреля 2011)

94
28.04.2012, 06:16
5 ответов

Переданные по каналу команды выполняются одновременно. Когда Вы работаете ps | grep …, это - чистая случайность (или вопрос деталей работ оболочки, объединенной с планировщиком, подстраивающим глубоко в кишечнике ядра) относительно ли ps или grep запускается сначала, и в любом случае они продолжают выполняться одновременно.

Это является очень наиболее часто используемым, чтобы позволить второй программе обрабатывать данные, как это прибывает из первой программы, прежде чем первая программа завершила свою операцию. Например,

grep pattern very-large-file | tr a-z A-Z

начинает отображать согласующие отрезки длинной линии в верхнем регистре даже прежде grep закончил пересекать большой файл.

grep pattern very-large-file | head -n 1

отображает первый согласующий отрезок длинной линии и может прекратить обрабатывать задолго до того grep закончил читать его входной файл.

Если Вы читаете где-нибудь, что переданные по каналу программы, запущенные в последовательности, сбегите из этого документа. Переданные по каналу программы, запущенные одновременно и всегда, имеют.

68
27.01.2020, 19:30
  • 1
    И что в моде об этом примере то, что, когда глава получает одну строку, ей нужно, она завершается и когда grep замечает это, она также завершается, не делая набора дальнейшей работы ни для чего. –  Joe 05.05.2012, 23:48
  • 2
    , который я предполагаю, существует некоторый буфер IO относительно канала..., как я знаю, что это - размер в байтах? Что я хочу считать для получения дополнительной информации о нем? :) –  n611x007 24.11.2013, 23:14
  • 3
    @naxa Там является двумя буферами на самом деле. Существует буфер stdio в grep программа, и существует буфер, управляемый ядром в самом канале. Для последнего посмотрите, Насколько большой буфер канала? спасибо –  Gilles 'SO- stop being evil' 24.11.2013, 23:29

Порядок команды выполняются на самом деле, не имеет значения и не гарантируется. Не принятие во внимание тайных деталей pipe(), fork(), dup() и execve(), оболочка сначала создает канал, кабелепровод для данных, которые будут течь между процессами и затем создают процессы с концами канала, подключенного к ним. Первый процесс, который выполняется, может заблокировать ожидание входа от второго процесса или блок, ожидающий второго процесса, чтобы начать считывать данные с канала. Они ожидают, может быть произвольно длинным и не имеют значения. Какой бы ни приказывают, чтобы процессы были выполнены, данные в конечном счете переданы, и все работает.

52
27.01.2020, 19:30
  • 1
    Хороший ответ, но OP, кажется, думает процессы, выполненные последовательно. Вы могли бы сделать это более ясным здесь, что процессы выполняются одновременно, и канал похож.... на канал между блоками, где потоки воды через все в (приблизительно). то же время. –  Keith 28.04.2012, 09:16
  • 2
    Спасибо за разъяснение. Источники, которые я читал, заставили его казаться, что переданные по каналу программы работали последовательно, а не одновременно. –  action_potato 28.04.2012, 10:58
  • 3
    Для наблюдения испытывают процессы, запускающиеся в неопределенной попытке вида выполнить это 1000 раз: повторите-n a> &2 | b> &2 –  Ole Tange 04.05.2016, 10:43

Обычно Вы выполняете это под ударом. работа процесса и запуск одновременно, но работают оболочкой параллельно. Как это возможно?

  1. если это не последняя команда в канале, создайте канал без имени с парой сокетов
  2. ветвление
  3. в ребенке повторно присваивают stdin/stdout сокетам, если ему было нужно (для первого процесса в канале stdin, не повторно присвоен, то же для последнего процесса и его stdout),
  4. в указанной команде дочернего ДОЛЖНОСТНОГО ЛИЦА с аргументами, которые уносят вдаль исходный код оболочки, но оставляют все открытыми ими сокеты. идентификатор дочернего процесса не будет изменен, потому что это - тот же дочерний процесс
  5. одновременно с ребенком, но параллелью под основной оболочкой переходят к шагу 1.

система не гарантирует, как быстрое должностное лицо будет выполняться и указало, что команда запускается. это независимо к оболочке, но системе. Это вызвано тем, что:

ps auxww| grep ps | cat

однажды шоу grep и/или ps команда, и затем теперь. Это зависит, как быстрое ядро действительно запускает процессы с помощью системной исполнительной функции.

1
27.01.2020, 19:30
  • 1
    установки, Параллельное выполнение означает, что два или больше процесса выполняются в течение того же периода времени, обычно со своего рода зависимостью между ними. Параллельное выполнение означает, что два или больше процесса выполняются одновременно (например, на отдельных ядрах процессора одновременно). Параллелизм не относится к вопросу, ни "как быстро" exec() выполняется, но как exec() вызовы и осуществление программ в канале чередованы. –  Thomas Nyman 06.09.2013, 13:25

Рискуя побить мертвую лошадь, кажется, заблуждение заключается в том, что

    A | B

эквивалентно

    A > temporary_file
    B < temporary_file
    rm temporary_file

, но еще в то время, когда была создана Unix и дети ездили на динозаврах в школу, Диски были очень маленькие, и это было обычным делом для довольно доброй команды. потреблять все свободное место в файловой системе.  Если бы B было что-то вроде grep some_very_obscure_string, конечный выход трубопровода может быть намного меньше, чем этот промежуточный файл.  Таким образом, труба была разработана, а не как сокращение для сначала "запустите A, а затем запустите B с входом из модели A", но как способ одновременного выполнения B с A и устранения необходимости хранения промежуточного файла на диске.

31
27.01.2020, 19:30

Вы спрашивали о порядке, и я думаю, что это очень важный аспект дела. Это не случайно (, как пытается сказать Жиль в своем ответе ).

Вот ps -ef, переданный в команду grep:

$ ps -ef | grep.
...
alexis   37188 55443  0 20:17 pts/4    00:00:00 ps -ef
alexis   37189 55443  0 20:17 pts/4    00:00:00 grep --color=auto.
...

Примечание. :Я удалил все остальные процессы из вывода, так как они не имеют значения для данного вопроса.

Как мы видим, в выводе есть ps -efи grep --color=auto.. Вы можете сейчас ответить на свой вопрос?

Да. Команда psимеет PID 37 188, а команда grepимеет PID 37 189. Ясно, что они были созданы слева направо, и никакая оболочка не должна делать это по-другому.

Технически, в C мы создаем каналы с помощью функции pipe(2), которая дает нам два файловых дескриптора. Один будет использоваться как stdoutиз ps, а другой как stdinиз grep. Достаточно просто сохранить файловый дескриптор для stdinдо тех пор, пока вы не запустите ps.

Далее,если вы посмотрите на конфигурацию вашей системы так:

$ getconf -a | grep PIPE_BUF
PIPE_BUF                           4096
_POSIX_PIPE_BUF                    4096

вы заметили два параметра, которые определяют размер канала в байтах. Это максимальное количество байтов, которое может быть в канале. Как только канал заполнен, устройство вывода(psв нашем первом примере )блокируется до тех пор, пока данные не будут прочитаны процессом на другой стороне канала(grepв нашем первом примере ).

Другими словами, поскольку выход psнамного больше, чем размер трубы:

$ ps -ef | wc
   1132   10819  121435

(т.е. около 120Кб выходных данных на моем компьютере на данный момент...)

Конвейер заблокировался бы очень быстро, если бы все выходные данные psбыли необходимы до запуска grep.

Таким образом, процессы очень быстро запускаются один за другим, но большую часть времени они выполняются параллельно (или одновременно, если у вас один процессор ). То есть команда psумрет первой. Это помечает канал как «готовый» (, вы получаете сигнал EOFпри чтении данных из него ), и именно так следующий инструмент узнает, что это сделано, и он также умирает, когда обрабатывает последние несколько байтов, которые он получил.

И наоборот, если процесс на правой стороне конвейера завершается раньше (до того, как процесс слева закончит запись в конвейер ), то процесс слева получает сигнал SIGPIPEкак только когда он пытается писать в трубу. Это делается для того, чтобы убедиться, что конвейер быстро умирает, если какой-либо из процессов внутри него умирает.

-1
31.08.2021, 03:45

Теги

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