История изменений
Исправление LeninGad, (текущая версия) :
На C знаю, как это сделать (см. fifo(7) про ENXIO), на каком-нибудь перлопитоне тоже скорее всего можно. Простого решения на шелле и утилитах не могу придумать (к сожалению, в читателе до прибытия писателя open не завершается — так бы fuser можно было проверить открытость пайпа, но он «ещё не открыт»).
Как должна работать такая утилита, вкратце: открыть пайп open с O_NONBLOCK|O_WRONLY, если вернулся ENXIO — читателя нет, пайп можно удалять, если же открылся — отключить O_NONBLOCK через fcntl(F_SETFL) и дальше уже писать что задумали (например, сделать exec того, что указано в командной строке, и отдать ему в наследство наш пайп в качестве stdout)
Исправление LeninGad, :
На C знаю, как это сделать (см. fifo(7) про ENXIO), на каком-нибудь перлопитоне тоже скорее всего можно. Простого решения на шелле и утилитах не могу придумать (к сожалению, в читателе до прибытия писателя open не завершается — так бы fuser можно было проверить открытость пайпа, но он «ещё не открыт»).
Как должна работать такая утилита, вкратце: открыть пайп open с O_NONBLOCK|O_WRONLY, если вернулся ENXIO — читателя нет, пайп можно удалять, если же открылся — отключить O_NONBLOCK через fcncl(F_SETFL) и дальше уже писать что задумали (например, сделать exec того, что указано в командной строке, и отдать ему в наследство наш пайп в качестве stdout)
Исходная версия LeninGad, :
На C знаю, как это сделать (см. fifo(7) про ENXIO и про линуксо-специфичную поддержку O_RDWR), на каком-нибудь перлопитоне тоже скорее всего можно. Простого решения на шелле и утилитах не могу придумать (к сожалению, в читателе до прибытия писателя open не завершается — так бы fuser можно было проверить открытость пайпа, но он «ещё не открыт»).