Вы можете создать именованный канал.
Сделайте что-нибудь вроде mkfifo input
, чтобы создать канал.
Запустите программу, вывод которой вы хотите прочитать, и перенаправьте вывод в канал, также известный как myprog> input
Затем запустите другую команду с вводом в качестве файла.
Обратите внимание, что трубы однонаправленные. Программа сможет читать, но не сможет писать.
Оба вызова 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 году ), это, вероятно, было единственный обратно совместимый способ сделать это.