Почему переданный по каналу вход хорошо к zenity, но <неправильное функционирование файла?

Ну, если Вы думаете, что хинду появляется получение по запросу слишком многих зависимостей, Вы могли бы попробовать Slackware. Или одна из его производных. Out-of-the-box, Slackware не пытается разрешить зависимости. Вообще.

Вы могли бы также хотеть исследовать Лунный Linux или ЗАТРУДНЕНИЕ.

3
16.07.2011, 15:23
2 ответа

Это похоже на ошибку в zenity. Вы видите то, что продолжается при помощи strace инструмент (я перенес strace строки в это сообщение, чтобы помочь читать).

С версией канала эта строка в strace показывает то, что происходит, когда канал закрывается (потому что cat выходы):

poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}], \
     3, 0) = 1 ([{fd=0, revents=POLLIN|POLLHUP}])

Та часть в конце - fd=0, revents=POLLIN|POLLHUP, в особенности POLLHUP - говорит zenity, что stdin завис (устройство записи канала ушло). Zenity обрабатывает это правильно и закрывает fd 0 позже.

Файлы не добираются POLLHUP события - вместо этого a read(2) результат нулевых средств EOF. Это - другой путь выполнения кода для zenity. Это опрашивает снова относительно fd 0, и это - то, что это получает:

poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}],\
     3, 0) = 1 ([{fd=0, revents=POLLIN}])
read(0, "", 1024)       = 0

Это должно быть концом его - нулевое чтение должно заставить zenity закрывать fd 0. Но это не делает. Вывод strace выше продолжает повторяться, как zenity продолжает опрашивать fd 0. До fd 0 закрывается, это всегда будет готово к чтению, как, именно так дескрипторы файлов на работе EOF, так как необходимо считать его для получения результата EOF.

Поскольку zenity не отвечает правильно на EOF на stdin, это сохраняет цикличное выполнение на a poll(2)/read(2) цикл, где poll возвраты сразу, как делает read. Снова, и снова и снова...

5
27.01.2020, 21:17
  • 1
    @camh: Ничего себе!... Это - некоторые потрясающее супервыслеживание... Я первоначально не мог вполне понять Ваше объяснение, но затем что-то образовало гель, когда я прочитал комментарий Caleb, "отправив данные как канал stdin по сравнению с передачей дескриптора файла"... Ваше объяснение стало совершенно прозрачным!... (так, таким образом, я это означает: не используйте <файл с zeinty, но данные передачи по каналу к нему прекрасен)... Спасибо, от счастливого туриста :)... –  Peter.O 16.07.2011, 21:38

Попробуйте это:

zenity --text='This does NOT hog the CPU' --list --column='#' --width=450 <(cat test)
0
27.01.2020, 21:17
  • 1
    Это не делает пожирателя ресурсов ЦП, но это также не отображает содержание 'теста'. Это отображается /dev/fd/63 instead... но sed -n p <(cat test) хорошо работает.. это производит правильный текст... Возможно, это - просто zenity вещь, но я все еще хотел бы знать то, что diffeence между' <тест' и 'тест кошки |', с которым zenity имеет проблемы. –  Peter.O 16.07.2011, 07:54
  • 2
    Этот ответ не должен иметь никакого эффекта на ошибку, zenity видел бы это то же как <test. Различие находится в отправке данных как канал stdin по сравнению с передачей дескриптора файла, который будет открыт и считан программой. –  Caleb 16.07.2011, 18:02

Теги

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