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

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

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

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

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

решение1

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

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

Если вы пытаетесь решить проблему "вывод моей программы всегда должен быть передан в другую программу", то не требуйте от пользователя использовать неясную подстановку процесса bash. А что, если оболочка по умолчанию в их системе - zsh? Bourne shell? Korn shell?

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

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

решение2

Используйте эту -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

Связанный контент