Процессорное время после завершения процесса

Есть ли в Linux функция, которая позволяет мне увидеть, сколько ЦП использовал процесс после его завершения? Мне нужно что-то похожее на команду bash «time». Я разветвляю () процесс, а затем жду завершения дочернего процесса, используя wait (). Способ точного измерения «реального» времени (фактического времени, прошедшего между fork() и exit()), даже когда вызов wait() был вызван спустя долгое время после того, как дочерний процесс стал зомби, также приветствуется, но я не уверен, что это возможный.


person Piotr Turek    schedule 13.08.2011    source источник
comment
Конечно есть способ, иначе команда time не сработала бы. Как отмечает man time: большая часть информации, отображаемой временем, получена из системного вызова wait3(2). stackoverflow.com/questions/ 7050360/ дал ответ, но не бойтесь смотреть на источник.   -  person msw    schedule 13.08.2011
comment
В системах на базе Debian apt-get source time даст вам исходный код.   -  person msw    schedule 13.08.2011
comment
Я был почти уверен, что время встроено в оболочку. Я вызывал wait() из Ruby, который, похоже, не имеет wait3 и друзей, завернутых в стандартную библиотеку. Но это не проблема, так как, наконец, мое расширение Ruby будет написано на C, сейчас я только прототипирую.   -  person Piotr Turek    schedule 13.08.2011
comment
Исторически сложилось так, что многие команды были реализованы вне оболочки, что делало раболепие в коде гораздо менее неприятным. Для хорошего времяпрепровождения попробуйте file /usr/bin/\[.   -  person msw    schedule 13.08.2011


Ответы (2)


Конечно, wait3 и wait4 вы рассмотрели. В качестве альтернативы (и более переносимой) вы можете использовать getrusage(2)< /а>.

Системные вызовы wait3() и wait4() похожи на waitpid(2), но дополнительно возвращают информацию об использовании ресурсов для дочернего элемента в структуре, на которую указывает rusage.

Пример: wait3

struct rusage usage;
wait3(&status, 0, &usage);

Пример: getrusage

Конечно, wait3 и wait4 — это просто удобство. Таким образом, вы можете использовать getrusage:

getrusage(RUSAGE_CHILDREN, &usage);

Недостатком является то, что это сообщает вам ресурсы, используемые ВСЕМИ завершенными детьми.

Итак, как только вы его получите, что вы будете делать с rusage? struct rusage имеет следующий вид:

struct rusage {
    struct timeval ru_utime; /* user CPU time used */
    struct timeval ru_stime; /* system CPU time used */
    /* More. */
};
person cnicutar    schedule 13.08.2011
comment
Нет, только функция bash может сделать это в bash. IE: Если бы вы написали программу, которая делала это, она должна была бы быть родителем дочерних элементов, информацию о которых вы хотите получить. В этом смысл команды unix time..., вызовите ее в своей программе bash, и она будет синхронизировать программу и всех дочерних элементов. /usr/bin/время myshell.sh - person Erik Aronesty; 18.07.2013

  1. Функция bash «times» сообщает об общем времени пользователя/системы, используемом оболочкой и ее дочерними элементами. Эта функция, к сожалению, не сообщает об общем объеме памяти, вводе-выводе и т. д. IE: она не использует getrusage (что должно быть).

  2. Программа /usr/bin/time даст вам время выполнения, объем памяти. Таким образом, вы можете сделать /usr/bin/time bash myprog.sh ... и получить накопленное время для всех детей.

person Erik Aronesty    schedule 18.07.2013