2015-08-03 3 views
1

Мне нужно выполнить «перфорированную статистику» в программе C для сбора статистики выполнения в реальном времени определенной функции, которая выполняется внутри цикла. Сценарий оболочки («perfExecution.sh») создан, который включает в себя,Выполнение «perf» в программе C

pid=$(pgrep programName) 
perf stat -e cycles,instructions,cache-misses:uk -p $pid 2>perf_stat.out 1>temp2.out 

Здесь «programeName» это имя моей программы C и «perfExecution.sh» выполняется в качестве дочернего процесса в основной C, прежде чем функции, которые должны быть проанализированы, вызываются.

pid_t childPID = fork(); 
char perfBuf[200]; 
int pid = getpid(); 
if (childPID == -1) 
{ 
    printf("failed to fork child\n"); 
    _exit(1); 
} 
else if (childPID == 0) 
{ 
    std::cout << "started stat collection for: " << pid << "\n"; 

    sprintf(perfBuf, "/home/user/Documents/Project/perfExecution.sh"); 
    system(perfBuf); 
} 
/* 
    Functions to be measured. 
*/ 
kill(childPID, SIGKILL); 
/* 
    Collect the statistics generated from perf. 
*/ 
` 

Выходной файл всегда возвращает пустой, даже если он получает статистические данные о производительности, когда «perfExecution.sh» вручную выполняется в другом терминале. Может кто-нибудь, пожалуйста, дайте мне знать, как правильно фиксировать требуемые статистические данные в рамках программы?

Спасибо.

+1

Уверены ли вы, что это C? Для меня это похоже на C++. –

+0

@TrippKinetics Действительно, 'std :: cout' ... является C++, но вопрос в том, что C. –

+0

Другим решением является использование' fork() 'и вариации' exec() ' –

ответ

1
#include <stdio.h> 
#include <stdlib.h> 

/* put script code here or in a header file of your choice */ 
#define SCRIPT "\ 
for ((j=0 ; j < 5 ; j++))\n\ 
do\n\ 
echo \"Count: $i\"\n\ 
done\n\ 
" 

int main(void) 
{ 
    system(SCRIPT); 
    return 0; 
} 

Можно читать больше здесь: http://www.unix.com/programming/216190-putting-bash-script-c-program.html

Для захвата выходного типа man popen в командной строке и читать о POPEN

+0

Спасибо. Да, общие сценарии работают таким образом. Я нашел, что это не работает для сценария «perf stat», который я упомянул в вопросе. Есть ли у вас какие-либо идеи относительно того, почему ?. – userDtrm

+0

@ Kaleb Прошу прощения, но я не понимаю, в каком коде выше помогает решить начальную проблему. – amigadev

2

Правильный способ добиться того, что вы пытаетесь сделать было бы использовать API perf_events (или другой такой API, как PAPI). Это позволит вам из вашего кода профилировать интересующий вас раздел.

Решение, которое вы пытаетесь использовать (вызов двоичного кода в вашем коде), является уродливым взломом.

Смежные вопросы