boost::process::std_out 不会 return 因为它试图打开一个 fifo
boost::process::std_out doesn't return because it's trying to open a fifo
当我 运行 这段代码时,boost::process::std_out > "myfifo"
行没有 return 因为它正在等待 open
对 return 的调用,它不是因为 "myfifo" 是先进先出。这是一个错误吗?
#include <boost/process.hpp>
int main(int, char**)
{
mkfifo("myfifo", 0600);
auto x = boost::process::std_out > "myfifo";
return 0;
}
这很有趣,因为您使用的代码的行为是未定义的。
首发
参数关键字实际上是一个 "DSL",它构建了供执行程序使用的扩展属性。
尽管未指定模板表达式的实现细节,但人们会期望单独的参数对象没有可观察到的副作用。
这使您观察到的挂起非常出色。我认为当参数表达式的单纯组合有副作用时(顺便说一句,甚至在破坏时),这是一个薄弱的设计。恕我直言,如果这些操作在流程执行时仅 运行 会好得多。
您可以将此报告给库开发人员(尽管他们可能会说 "don't do that" 并将其标记为 "by design")。
其次,你的预期是错误的
实际上bp::std_out > "filename"
,并没有尝试打开 fifo。它会尝试创建 文件(因为它是只写的,而您打算向其中写入数据)。
如果要写入 fifo,则需要使用 pipe
或 async_pipe
工具。
当我 运行 这段代码时,boost::process::std_out > "myfifo"
行没有 return 因为它正在等待 open
对 return 的调用,它不是因为 "myfifo" 是先进先出。这是一个错误吗?
#include <boost/process.hpp>
int main(int, char**)
{
mkfifo("myfifo", 0600);
auto x = boost::process::std_out > "myfifo";
return 0;
}
这很有趣,因为您使用的代码的行为是未定义的。
首发
参数关键字实际上是一个 "DSL",它构建了供执行程序使用的扩展属性。
尽管未指定模板表达式的实现细节,但人们会期望单独的参数对象没有可观察到的副作用。
这使您观察到的挂起非常出色。我认为当参数表达式的单纯组合有副作用时(顺便说一句,甚至在破坏时),这是一个薄弱的设计。恕我直言,如果这些操作在流程执行时仅 运行 会好得多。
您可以将此报告给库开发人员(尽管他们可能会说 "don't do that" 并将其标记为 "by design")。
其次,你的预期是错误的
实际上bp::std_out > "filename"
,并没有尝试打开 fifo。它会尝试创建 文件(因为它是只写的,而您打算向其中写入数据)。
如果要写入 fifo,则需要使用 pipe
或 async_pipe
工具。