如果命令行有多个管道,如何获取用于调用程序的完整命令行

How to get the full cmdline that is used to call a program, if the cmdline has multiple pipes

本文关键字:命令行 用于 获取 调用 程序 管道 何获取 如果      更新时间:2023-10-16

我正在写一个框架,来跟踪人们如何使用我的实用程序,如示例实用程序'result'我想在result中加入一段代码。CXX main()将记录诸如

之类的内容
1. what arguments were given to result = argc, argv
2. what other programs were used to process stuff and pipe to my utility 'result'

如:我试图运行一个程序'结果',这是从管道提供输入,如

abc -e earg -t targ | process_stuff_out_data | result -s sarg 

现在在结果中。cxx用于捕获管道输入

    std::string piped_data;
    std::getline(std::cin, piped_data);

适用于

这样的情况
    echo "1 2 3 " | result -i in_number
    // here the piped input is just "1 2 3" so i am able to log it from result

但不适用于前一个程序的输出是二进制数据流的情况

    abc -e earg -t targ | out_bin_data | result -s sarg

在本例中,我只想

    LOG_PIPED_STUFF: abc -e earg -t targ | process_stuff_out_data 

std::getline在读取换行符之前不会返回,参见这里:http://www.cplusplus.com/reference/string/string/getline当数据可用时,使用另一个分隔符号或使用另一个函数从标准输入中读取。例如,您可以使用feof(stdin)来检查stdin是否有可用的字节,然后使用read()方法。如果你在linux上,你可以使用select(2)来等待文件描述符0的输入。

无法获取数据的可能原因

  • 数据是二进制的,没有换行符。你需要使用二进制I/O调用
  • 数据被缓冲。如果可以重写的话,您需要刷新中间进程process_stuff_out_data的标准输出,或者只是等待abcprocess_stuff_out_data退出。
  • process_stuff_out_data写入标准错误,而不是标准输出。或者它正在写入控制台(ugh),即/dev/console。