Цикл с условием продолжения Bash и читающий из канала

Если Вы хотите решение GUI, и у Вас есть браузер Konqueror, можно ввести ftp:// и ftp обращается и просматривает структуру каталогов.

Это кажется, что можно хотеть решение для командной строки, как бы то ни было.

3
20.10.2012, 00:00
3 ответа

Во-первых, программа может сделать свою собственную выходную буферизацию. Это иногда называют “stdio буферизующий” после названия компонента библиотеки, который выполняет эту задачу в C: функции как putc, fputs, fprintf, и т.д., объявленный в stdio.h. Если это сделает, то это произведет вывод в пакетах, обычно нескольких килобайтов (когда вывод будет терминалом, значение по умолчанию должно сбросить буфер в каждом символе новой строки).

В какой-то момент, или программист или базовые вызовы библиотечной функции write явно. Это запрашивает, чтобы ядро записало указанные данные в канал. Ядро может решить записать все или часть данных. Так как файл является каналом, ядро скопирует данные в буферную область канала. Если буфер канала полон, то write блоки системного вызова до существуют комната: Ваша программа (или более точно, поток, который звонил write, в случае, если существует несколько потоков уровня ядра), не возобновит выполнение до вызова к write возвраты.

(Это возможно, но вряд ли в этом situtation, что программа установила дескриптор файла канала как неблокирование. Если это верно, если ядро решит, что не может скопировать данные, то оно возвратит управление программе; write системный вызов возвращается 0. Программа, которая делает такие системные вызовы неблокирования, обычно звонила бы select или poll или epoll в цикле для блокирования, пока одни из дескрипторов файлов, на которых это связывается, не готовы к вводу или выводу.)

То, что программа заблокирована во время системного вызова, не связано с выбором алгоритма планирования. В его ядре любой планировщик различает готовые потоки, которым можно дать процессорное время и потоки ожидания, которые не могут. Суть планировщика должна выбрать готовый поток и позволить ему работать до любого, которого поток делает системным вызовом (который помещает поток в состояние ожидания), или некоторое асинхронное событие имеет место (на практике, прерывание процессора). Во время обработки системного вызова может случиться так, что поток, который был до тех пор заблокирован, становится готовым, например, потому что тот поток был в a write звоните и ядро теперь смогло освободить данные из того вызова. Несколько вещей могут сделать готовый поток заблокированным из внешней стороны, например, сигнал приостановиться (SIGSTOP). Планировщик ведет некоторый готовый список для решения который поток запланировать затем: список потоков, которые готовы (это обычно намного более сложно, чем простой список в реальном планировщике).

5
27.01.2020, 21:11

Это назвало канал. Выполненный man 7 pipe и Вы узнаете все о том, как работают каналы.

Отредактированный для добавления: Короче говоря, винный вывод команды собран в буфере. Когда буфер полон, и вино пытается записать больше, винный процесс останавливается ядром. Когда пространство становится доступным в буфере (т.е. когда чтения цикла с условием продолжения от него), остановленный процесс повторно пробужден, и позволяется продолжиться. Это - классический алгоритм ограниченного буфера, но в мире Unix/Linux он обычно называл канал. Это очень популярно и мощно, и я рекомендую узнать все об этом.

2
27.01.2020, 21:11
  • 1
    я не хочу быть грубым, но "прочитайте руководство" являюсь видом ответа, который я ожидал бы на Slashdot. Предоставленный, прочитайте руководство, вероятно, ответ, который работает над большинством вопросов с нулевым требуемым усилием. –  Magnus 19.10.2012, 21:13
  • 2
    @Magnus, О, я сожалею. Я не означал это отрываться как грубое прочитайте руководство. Вопрос ищет объяснение и объяснение, которое наиболее относится к корреспонденту, ловко доступно в той странице справочника, таким образом, это, казалось, было оптимальным ответом. –  aecolley 19.10.2012, 21:23
  • 3
    Хорошо, я прочитал страницу справочника теперь, и кажется, что поведение зависит от того, был ли флаг O_NONBLOCK установлен или нет. Я предполагаю, что буду просто запускать скрипт и видеть, аварийно завершается ли он. –  Magnus 19.10.2012, 21:27
  • 4
    Если Вы не хотите, чтобы вино заблокировалось, не теряя данные, можно установить названную программу buffer и выполненный это в конвейере с любым размером буфера Ваша система обработает. Очевидно, с достаточным выводом необходимо будет в конечном счете поставить под угрозу и или потерять записи или позволить вину блокироваться; но buffer позволит Вам протянуть его и пережить большие пакеты вывода. –  aecolley 19.10.2012, 21:36
  • 5
    Это работает прямо сейчас с, я предполагаю стандартный размер буфера 64K, и, кажется, работает до сих пор... У меня есть 16 ГБ памяти на этом поле, поэтому если это перестанет работать, то я попробую Ваше предложение =) –  Magnus 19.10.2012, 21:43

Nah, никакая черная магия (хорошо не на этот раз, по крайней мере). Это просто использует Ваш кэш и буферы в потоке вывода.

1
27.01.2020, 21:11
  • 1
    И что происходит, когда буфер полон? –  Magnus 19.10.2012, 21:14
  • 2
    Не Делайте Вы имеете в виду: Да, черная магия, иначе известная как буфер. @Magnus, когда буфер получения полон, пытается записать в stdout в блоке Unix. Я ничего не знаю о программировании Windows, таким образом, я не могу сказать, как вино передает это на myprogram.exe. –  dubiousjim 19.10.2012, 21:20
  • 3
    я не Linux, программируя гуру..., когда Вы говорите, что блоки записи, который означает, что ядро отмечает, что программа пытается записать в полный буфер stdout, и затем приостановят поток и только разбудят он, после того как канал больше не полон? –  Magnus 19.10.2012, 21:33
  • 4
    @Magnus В *отклоняет программу, пишущую в stdout, совпадает с записью в файл. Когда вывод печати приложения, это делает запись () системным вызовом дескриптора файла 1. Операция не завершится, пока запись () не закончена в той точке, она "заблокирована". –  jordanm 19.10.2012, 22:12

Теги

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