boost::process::std_out не возвращается, потому что пытается открыть fifo
Когда я запускаю этот код, boost::process::std_out > "myfifo"
линия не возвращается, потому что она ждет на open
призываем вернуться, чего не происходит, потому что "myfifo" - это fifo. Это ошибка?
#include <boost/process.hpp>
int main(int, char**)
{
mkfifo("myfifo", 0600);
auto x = boost::process::std_out > "myfifo";
return 0;
}
1 ответ
Это интересно, потому что поведение используемого вами кода не определено.
Прежде всего
Ключевые слова параметра - это, по сути, "DSL", который строит свойства расширения, которые будут использоваться исполнителем.
Несмотря на то, что детали реализации шаблонных выражений не определены, можно ожидать, что объекты с одиночным параметром не будут иметь видимых побочных эффектов.
Это делает ваш наблюдаемый зависание замечательным. Я думаю, что это слабый дизайн, когда простая композиция выражений аргументов имеет побочные эффекты (даже на разрушение, между прочим). Было бы намного лучше, если бы действия выполнялись только во время выполнения процесса, ИМХО.
Вы можете сообщить об этом разработчикам библиотеки (хотя они, вероятно, скажут "не делайте этого" и отметят это как "намеренно").
Во-вторых, ваши ожидания не верны
по факту bp::std_out > "filename"
, не пытается открыть FIFO. Он пытается создать файл (поскольку он предназначен только для записи, и вы намереваетесь записать в него данные).
Если вы хотите написать в fifo, вы захотите использовать pipe
или же async_pipe
объекты.