Зачем удалять файл fifo сразу после присоединения к файловому дескриптору? - PullRequest
0 голосов
/ 05 мая 2020
fifo_file=fifo.pipe
mkfifo $fifo_file
exec 6<>$fifo_file
rm $fifo_file
some_code_omit

Приведенный выше сценарий bash создает именованный канал и присоединяет его с файловым дескриптором 6

exec 6<>$fifo_file

Зачем немедленно удалять файл fifo rm $fifo_file после присоединения к файлу дескриптор? Могу ли я написать код, как показано ниже?

fifo_file=fifo.pipe
mkfifo $fifo_file
exec 6<>$fifo_file
some_code_omit
rm $fifo_file

Есть ли между ними какая-то разница?
rm $ fifo_file означает удалить имя $ fifo_file вместо удаления файла $ fifo_file, файл все еще существует там после rm $ fifo_file.

1 Ответ

0 голосов
/ 05 мая 2020

Удаляя запись файловой системы (которая оставляет фактический файл нетронутым до тех пор, пока он не будет закрыт для чтения и записи) после того, как файл был создан и открыт для чтения и записи, вы избегаете загрязнения файловой системы бесполезной записью. К сожалению, это означает, что если сценарий умирает до того, как будет запущена команда rm, команда mkfifo завершится ошибкой при следующем запуске:

$ mkfifo foo
$ mkfifo foo
mkfifo: cannot create fifo 'foo': File exists

Возможное улучшение здесь будет до

  1. гарантирует избежание столкновений, создавая разные файлы при каждом запуске,
  2. создает файл fifo в каталоге, доступном только его создателю (при условии, что вы используете разумную маску), и
  3. очистка при выходе из сценария без каких-либо проблем с синхронизацией:
trap 'rm --recursive "$working_directory"' EXIT
working_directory="$(mktemp --directory)"
fifo_file="${working_directory}/fifo.pipe"
…
...