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;
}

person Mike    schedule 14.12.2017    source источник
comment
На что вы надеетесь, что auto x = boost::process::std_out › myfifo; линия подойдет? с одним › это сравнение, но я сомневаюсь, что эти два аргумента сопоставимы. Вы имеете в виду >>?   -  person SoronelHaetir    schedule 15.12.2017
comment
boost::process перегружает operator> для настройки перенаправлений из вызовов процессов. Я хотел бы использовать его в вызове boost::process::child::child для запуска процесса, но он зависает здесь, прежде чем я даже могу его вызвать.   -  person Mike    schedule 15.12.2017
comment
@SoronelHaetir Немного иронично, что вы опубликовали этот комментарий, явно даже не просматривая документы и не используя Boost Process раньше :)   -  person sehe    schedule 15.12.2017


Ответы (1)


Это интересно, потому что поведение используемого вами кода не определено.

Прежде всего

Ключевые слова параметра фактически являются «DSL», который создает свойства расширения, которые будут использоваться исполнителем.

Несмотря на то, что детали реализации шаблонных выражений не определены, можно было бы ожидать, что объекты с одиночными параметрами не будут иметь наблюдаемых побочных эффектов.

Это делает ваш наблюдаемый зависание замечательным. Я думаю, что это слабый дизайн, когда простая композиция выражений-аргументов имеет побочные эффекты (кстати, даже при разрушении). Было бы намного лучше, если бы действия запускались только во время выполнения процесса, ИМХО.

Вы можете сообщить об этом разработчикам библиотеки (хотя они, вероятно, скажут «не делайте этого» и пометят это как «по замыслу»).

Во-вторых, ваши ожидания неверны

На самом деле bp::std_out > "filename" не пытается открыть файл fifo. Он пытается создать файл (поскольку он предназначен только для записи, и вы собираетесь записывать в него данные).

Если вы хотите записать в FIFO, вам нужно будет использовать средства pipe или async_pipe.

person sehe    schedule 14.12.2017
comment
Во-первых, это не шаблон DSL, выполняемый другим кодом. Поверьте мне, я изучил код. Я тоже сначала так подумал. Но нет, фактически открытый звонок сделан в коде, который я написал. Вполне разумно сделать это таким образом. Не нужно делать DSL. Во-вторых, это не реальный код. Это наименьший фрагмент кода, иллюстрирующий проблему, поэтому он не включает весь остальной код, ведущий к ней. - person Mike; 15.12.2017
comment
Вы пропустили 80% моего ответа? Я не просто прокомментировал, что вы делаете это неправильно в вопросе, не так ли? Я это понял, просто было неясно, в курсе ли ты вещей. В конце концов, вы не упоминаете об этом, и есть другие вещи, о которых вы не знали (о которых я упоминаю в своем ответе). Извините, если иногда нам нужно предположить вещи, которые не являются явными в вопросе. - person sehe; 15.12.2017
comment
Ре.: Поверь мне. Эм. Я написал исправления ошибок и разработал новые пользовательские расширения. [В любом случае, я указал на то же самое, что вы объясняете, в своем ответе. Я придерживаюсь мнения, что это недостаток дизайна. Я рад не согласиться с кем-либо в этом.] - person sehe; 15.12.2017
comment
Я не пытался быть ослом, хотя, думаю, это можно понять из моего комментария. Во всяком случае, я не могу использовать конструктор pipe(const std::string& name), потому что он разъединяет fifo после его открытия, что, как я полагаю, имеет смысл в некоторых ситуациях, но не в моем случае, потому что я пытаюсь читать из fifo вне запущенного boost::process процесса. Любые другие идеи? - person Mike; 15.12.2017
comment
Да, я бы отправил запрос функции, а пока настроил цикл асинхронного чтения (единственное, что действительно надежно работает, во всяком случае, IIRC), который копирует из fifo в async_pipe. Дай подумать, делал ли я что-то подобное когда-то. Но это придется сделать позже. - person sehe; 15.12.2017