Как перехватить вывод strace в программе C ++

Я хочу проанализировать вывод strace в моей программе на C ++. При запуске /bin/strace ps из моего приложения я получаю вывод от ps, но не от strace, а вывод strace выводится на стандартный вывод (мой терминал). Я использую стандартную технику использования каналов и перенаправления потоков.

Вот мой источник:

#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 в моей программе?

1

Решение

Стрейс пишет 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;
}

НТН

1

Другие решения


По вопросам рекламы [email protected]