Недопустимые аргументы при монтировании с MS_SHARED

Вы можете создать именованный канал.

Сделайте что-нибудь вроде mkfifo input , чтобы создать канал.

Запустите программу, вывод которой вы хотите прочитать, и перенаправьте вывод в канал, также известный как myprog> input

Затем запустите другую команду с вводом в качестве файла.

Обратите внимание, что трубы однонаправленные. Программа сможет читать, но не сможет писать.

1
01.05.2019, 12:06
1 ответ

Оба вызова mount в показанном коде требуют изменений. В первом вызове при создании монтирования можно не указывать флаг MS_SHARED; это вызывает вашу ошибку EINVAL. Вместо этого просто создайте монтирование без этого флага (, т. е. аргумент flagsдолжен быть равен 0 ). Это создаст новую точку монтирования с типом распространения по умолчанию. Это либо MS_SHARED, если родительское монтирование также имеет совместное распространение, либо тип распространения — MS_PRIVATE. (Подробнее см. в разделе ПРИМЕЧАНИЯ на странице руководства mount_namespaces(7).)

Во втором вызове mount()вам не нужен флаг MS_REMOUNT, и фактически, когда вы используете этот флаг, флаг MS_PRIVATEигнорируется. См., в частности, крепление (2)страницу руководства (,обратите внимание на слова «с проведением испытаний в порядке, указанном здесь»):

   A call to mount() performs one of a number  of  general  types  of
   operation,  depending  on  the  bits specified in mountflags.  The
   choice of which operation to perform is determined by testing  the
   bits  set  in  mountflags,  with  the tests being conducted in the
   order listed here:

   *  Remount an existing mount: mountflags includes MS_REMOUNT.

   *  Create a bind mount: mountflags includes MS_BIND.

   *  Change the propagation type of an  existing  mount:  mountflags
      includes  one of MS_SHARED, MS_PRIVATE, MS_SLAVE, or MS_UNBIND‐
      ABLE.

   *  Move an existing mount to a new location:  mountflags  includes
      MS_MOVE.

   *  Create  a  new  mount:  mountflags  includes  none of the above
      flags.

Просто удалите флаг MS_REMOUNTво втором вызове mount(), и вы должны получить результат, который, (я думаю, )вам нужен.

Я не совсем уверен в причинах, по которым требуется этот двухэтапный -процесс, но я подозреваю, что причина в ограничениях дизайна mount()API. В этот API постоянно добавлялись части на протяжении многих лет (, см. приведенный выше текст для доказательства этого ), и к тому времени, когда была добавлена ​​функция распространения монтирования (примерно в 2005 году ), это, вероятно, было единственный обратно совместимый способ сделать это.

0
28.01.2020, 00:12

Теги

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