如果命令行有多个管道,如何获取用于调用程序的完整命令行
How to get the full cmdline that is used to call a program, if the cmdline has multiple pipes
我正在写一个框架,来跟踪人们如何使用我的实用程序,如示例实用程序'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
的标准输出,或者只是等待abc
和process_stuff_out_data
退出。 -
process_stuff_out_data
写入标准错误,而不是标准输出。或者它正在写入控制台(ugh),即/dev/console。
相关文章:
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- LLVM | codegen 用于带有命令行选项的程序输入功能
- system() 不适用于修改命令行提示符
- 将编译器命令行转换为 CMakeLists.txt用于 Casablanca Rest SDK
- 用于使用命令行参数C++的生成文件和 Bash 脚本
- 将命令行参数用于输入参数
- 用于在 Visual Studio 2005 中编译 Win32 "hello world"的命令行
- istream用于C++/Poco的命令行输入
- 用于ffmpeg命令行的c/c++程序
- Qt可以用于编写仅限命令行的应用程序吗
- 在 c++ 中处理代码的命令行参数,用于随机输入和用户输入
- 用于解析C++中的命令行参数的库
- 用于C++的Netbeans IDE如何指定命令行参数
- CMake命令行用于C++#define
- 如何使用cmake脚本从命令行选择用于编译C++代码的xcode版本
- 适用于 Windows 7 的简单"javac"样式命令行 C/C++ 编译器
- 如果命令行有多个管道,如何获取用于调用程序的完整命令行