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

时间:2016-06-30 16:41:09

标签: c++ c linux

我正在编写一个框架,以跟踪人们如何使用我的实用程序,例如示例实用程序'结果' 所以我想把一段代码放入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 

现在在result.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 

2 个答案:

答案 0 :(得分:1)

std :: getline将不会返回,直到它读取换行符,请参见此处:http://www.cplusplus.com/reference/string/string/getline 在数据变得可用时,使用另一个分隔符标记或仅使用另一个函数从标准输入读取。 你可以使用例如feof(stdin)检查stdin是否有可用的字节然后fread()它们。 如果您使用的是linux,则可以使用select(2)等待文件描述符0的输入。

答案 1 :(得分:0)

您没有获取数据的可能原因

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