簡體   English   中英

如何在C ++程序中捕獲strace的輸出

[英]How to capture output of strace in C++ program

我想在我的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM