gpt4 book ai didi

c++ - 如何在 C++ 程序中捕获 strace 的输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:26 25 4
gpt4 key购买 nike

我想在我的 C++ 程序中分析 strace 的输出。从我的应用程序启动 /bin/strace ps 时,我得到了 ps 的输出,但不是来自 strace 的输出,并且 strace 输出被打印到 stdout(我的终端)。我使用使用管道和重定向流的标准技术。

这是我的来源:

#include <stdlib.h> 
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
int main(){
char *const parmList[] = {"/bin/strace", "ps", NULL};
int pipes[2];
pipe(pipes);
pid_t child = fork();
if(child == 0){
close(pipes[0]);
dup2(pipes[1],1);
execv(parmList[0], parmList);
}
else{
int status;
wait(&status);

fcntl(pipes[0], F_SETFL, O_NONBLOCK | O_ASYNC);
char buf[128] = {0};
ssize_t bytesRead;
std::string stdOutBuf;
while(1) {
bytesRead = read(pipes[0], buf, sizeof(buf)-1);
if (bytesRead <= 0)
break;
buf[bytesRead] = 0;
stdOutBuf += buf;
}
std::cout << "<stdout>\n" << stdOutBuf << "\n</stdout>" << std::endl;
}

close(pipes[0]);
close(pipes[1]);

return 0;
}

如何在我的程序中获得 strace 的输出?

最佳答案

strace 写入 stderr 而不是 stdout,如果您只想捕获 strace 输出只需使用 stderr 而不是 stdout

像这样更改 dup2

     dup2(pipes[1],2);

如果你想组合 strace 和 ps 输出,请执行以下操作:

    dup2(pipes[1],1);
dup2(pipes[1],2);

如果你想要分离输出,你可能需要使用非阻塞读取和 select() 或 poll()

此外:在调用 exec 之后你应该打印一条错误消息,如果一切正常 exec 将不会返回,但如果 exec 出现问题,最好知道。

std::cerr << "exec failed!";

我使用了这段代码并取得了成功:

#include <stdlib.h> 
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
int main(){
char *const parmList[] = {"/usr/bin/strace", "ps", NULL};
int pipes[2];
pipe(pipes);
pid_t child = fork();
if(child == 0){
close(pipes[0]);
dup2(pipes[1],2);
execv(parmList[0], parmList);
std::cerr << "exec fail\n" ;
}
else{
int status;
wait(&status);

fcntl(pipes[0], F_SETFL, O_NONBLOCK | O_ASYNC);
char buf[128] = {0};
ssize_t bytesRead;
std::string stdOutBuf;
while(1) {
bytesRead = read(pipes[0], buf, sizeof(buf)-1);
if (bytesRead <= 0)
break;
buf[bytesRead] = 0;
stdOutBuf += buf;
}
std::cout << "<stdout>\n" << stdOutBuf << "\n</stdout>" << std::endl;
}
close(pipes[0]);
close(pipes[1]);

return 0;
}

HTH

关于c++ - 如何在 C++ 程序中捕获 strace 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27615444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com