Как я могу определить в моей системе, где процесс подстановки создает файлы FIFO?

406
Earl Sven

Я пишу приложение на C ++ и мне нужно работать с подстановкой процессов в оболочке Bash.

Я пытаюсь найти способ проверки путей, передаваемых в качестве аргументов моей программе, некоторые из которых указывают на файлы FIFO, созданные путем подстановки процессов.

Есть ли способ оболочки (или C ++), чтобы я мог проверить, создает ли система эти файлы /dev/fdили они созданы где-то еще?

0

2 ответа на вопрос

0
dogbane

Используйте -pопцию, testесли файл является каналом:

#!/bin/bash file="$1" if [ -p "$file" ] then echo "$file is a pipe" fi 

Демо-версия:

$ myscript.sh <(echo hello) /dev/fd/63 is a pipe 
Спасибо, это может быть полезно для построения решения, однако оно не говорит мне, где эти файлы создаются по умолчанию (/ dev / fd в большинстве систем). Есть ли переменная окружения или что-то, что я мог бы проверить, чтобы увидеть, что это за путь? Earl Sven 12 лет назад 0
Зачем? Вам не нужно знать, где они созданы. dogbane 12 лет назад 0
The reason I need to know is to validate paths passed as an argument to my application. Essentially what I call is `myProg -fifopaths >(/run/some/application)` what my program sees passed as the arguments to its main is `/path/to/myProg -fifopaths /dev/fd/63` etc. I need to validate that any paths passed to my program are in fact in `/dev/fd` to be sure they are paths to a FIFO. The problem arises that if my program is executed on _System-X_ where FIFO paths are not in `/dev/fd`, I need to know where these FIFO paths are supposed to be on _System-X_ in order to validate the arguments. Earl Sven 12 лет назад 0
0
ZILjr

Короткий ответ: вы не можете этого сделать. То, что в каталоге по умолчанию bash указываются пути fifo, не означает, что конкретное fifo в этом каталоге было создано bash или что оно было передано bash в качестве аргумента вашей команде.

Посмотрите на общую картину вашей проблемы. Что вы ДЕЙСТВИТЕЛЬНО пытаетесь решить?

Если вы пытаетесь решить, «вывод моей программы должен всегда передаваться в другую программу», тогда не требуйте от пользователя использовать скрытую подстановку процесса в bash. Что, если оболочкой по умолчанию в их системе является zsh? Оболочка Борна? Корн скорлупа?

Вместо этого попросите вашу программу создать pipe, fork и выполнить другую программу.

Итак, что вы действительно пытаетесь сделать? Что произойдет, если вы, не дай Бог, запишите свой вывод в файл, который передал пользователь вашей программы, а не в fifo, созданный bash?

Я согласен, это требование немного неясно! Однако, к сожалению, я не могу изменить его, так как приложение представляет собой программный симулятор, который имитирует поведение другого приложения, работающего встраиваемых на каком-либо оборудовании - приложение, которое оно эмулирует, не было написано мной, и я не могу изменить его структуру аргументов. Поскольку варианты использования такого симулятора довольно ограничены, вряд ли это создаст проблему, я просто подумал, есть ли простой способ проверить это (файл конфигурации bash или что-то в этом роде). Спасибо! Earl Sven 12 лет назад 0

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