Использование dtrace в задаче C

Я использую dtrace с приведенными ниже параметрами для расчета использования сетевого трафика конкретным процессом:

sudo dtrace -n 'syscall::recvfrom:return { @[pid] = sum(arg0); }'

Как я могу использовать dtrace в задаче C?

Я использовал NSTask для запуска dtrace с указанными выше параметрами, но, поскольку результаты этой команды dtrace отображаются после завершения dtrace, я не мог видеть результаты, пока не завершу dtrace. Поскольку dtrace остается в цикле для расчета трафика данного процесса, и из-за использования NSPipe я не мог использовать команду [task terminate]. Итак, мой главный вопрос:

Как использовать dtrace в объекте C с NSTask или без него (через другой метод) и правильно завершить его, а затем увидеть результаты?


person user3323552    schedule 26.06.2014    source источник


Ответы (1)


Поведение по умолчанию — ничего не распечатывать, но вы можете добавить кикер профиля, чтобы он печатал вывод с интервалом. Добавление предложения вроде:

profile:::tick-1sec
{
  printa(@);
}

должен достичь желаемого эффекта.

или, как при использовании вашего вызова sudo:

sudo dtrace -n 'syscall::recvfrom:return { @[pid] = sum(arg0); } profile:::tick-1sec { printa(@); }'
person Petesh    schedule 26.06.2014
comment
Это не работает для NSTask, и все же я не мог видеть результаты через канал. - person user3323552; 28.06.2014
comment
Я нашел решение своей проблемы с помощью приведенного выше ответа. Для получения результата через pipe мы должны использовать [file availableData]. - person user3323552; 28.06.2014