Почему нам нужны два дескрипторов файлов при создании канала без имени?

Отвечать на мой собственный вопрос:

Ответ Ignacio заботится о большом значке в системном меню и средстве запуска панели задач, если Вы добавляете тот. Изменение значка на кнопке кнопки/панели панели задач взяло больше рытья.

Удаление 'собственного' Firefox от LMDE (sudo apt-get remove firefox) и установка tar.gz из http://getfirefox.com все еще оставила меня с оранжевым глазным яблоком на кнопке панели.

Таким образом, я начал искать через папки и в конечном счете нашел его: значок, который я не могу выдержать, находится в /usr/share/icons/Mint-X/apps/16/firefox-png.

Я переименовал файл к firefox-ugly-icon.png, и скопированный в значке я хочу (от другой системы). Проблема решена.

4
20.06.2013, 02:29
2 ответа

Как указано @MelBoyce в его комментарии, это из-за концептуальной природы канала. Это имеет вход и вывод, и Вы читаете байты из вывода в том же самом порядке, который они были записаны во вход. Каналы не являются общими файлами или указателями, Вы не, предполагают, чтобы читать и записать где угодно в нем. Вы вынуждены считать первые байты, которые ввели канал и что никогда еще не быть считанными.

Каналы могут быть реализованы как буфер в памяти, но реализация могла варьироваться, если в будущем, если другой более эффективный способ сделать это изобретен, например. Однако концептуальная природа канала не изменится. Вы будете все еще использовать то же read(1) и write(1) системные вызовы и они все еще ведут себя то же. Дескрипторы файлов, которые Вы получаете, когда Вы звоните pipe(1) используются, чтобы вынудить Вас использовать канал правильно (и дополнительно обеспечить некоторое управление доступом). Тем путем будущие модификации в реализации не взломают Ваш код.

5
27.01.2020, 20:51
  • 1
    Кроме того, не имеет смысла фокусироваться на канале с точки зрения единственного процесса. Канал является механизмом межпроцессорного взаимодействия; только имеет смысл использовать, когда процесс считывания запрашивает информацию от записи. –  tripleee 19.06.2013, 18:30

Важная функция отсутствовала бы если pipe возвращенный единственный дескриптор файла, который будет использоваться и для чтения и для записи: не было бы никакого способа сигнализировать о EOF.

С каналами, как они, чтение fd видит EOF, когда последняя копия записи fd закрывается. С гипотетическими единственными-fd каналами Вам был бы нужен дополнительный syscall, как shutdown для сокетов, но относившийся канал. (Помните, что каналы являются более старым, чем сокеты, и shutdown не существовал перед сокетами.)

И кто был бы ответственен за вызов этого pipe_shutdown() syscall? Предположим, что Вы делаете это:

grep foo /etc/passwd | head

Если существует только единственный fd, который grep и head оба наследовались, затем так или иначе когда grep выходы, head потребности получить EOF. Но fd, сохраненный head процесс перезаписываем, таким образом, ядро не знает наверняка, что ничто больше не будет записано в канал. Можно думать: выход процесса должен автоматически отправить EOF на всем канале fds сохраненный процессом. Но это повредит много материала, как

( echo FOO ; grep foo /etc/passwd ) | more

echo записи к каналу и выходам, и мы не хотим, чтобы EOF произошел все же. grep все еще собирается записать в канал. И та проблема не ограничена "неясным" случаем заключенных в скобки подоболочек. Это может произойти любое время, сценарий оболочки используется на левой стороне канала.

Если Вы обдумаете его, канал, механизм EOF действительно требует различия между fds, который может записать в канал и fds, который может только считать его. И это не зависит от того, сколько процессов включено.

2
27.01.2020, 20:51

Теги

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