/** * @note Copyright (C) 2013 Philippe Gerum . * * Xenomai is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Xenomai is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xenomai; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include #include #include #include #include #define PROC_ACCT "/proc/xenomai/sched/acct" #define PROC_PID "/proc/%d/cmdline" #define ACCT_FMT_1 "%u %d %lu %lu %lu %lu %lx %Lu %Lu %Lu" #define ACCT_FMT_2 ACCT_FMT_1 " %[^\n]" #define ACCT_NFMT_1 10 #define ACCT_NFMT_2 11 int main(int argc, char *argv[]) { char cmdpath[sizeof(PROC_PID) + 32], cmdbuf[BUFSIZ], acctbuf[BUFSIZ], name[64]; unsigned long ssw, csw, xsc, pf, state, sec; unsigned long long account_period, exectime_period, exectime_total, v; unsigned int cpu, hr, min, msec, usec; FILE *acctfp, *cmdfp; int pid; acctfp = fopen(PROC_ACCT, "r"); if (acctfp == NULL) error(1, errno, "cannot open %s\n", PROC_ACCT); printf("%-6s %-17s %-24s %s\n\n", "PID", "TIME", "THREAD", "CMD"); while (fgets(acctbuf, sizeof(acctbuf), acctfp) != NULL) { if (sscanf(acctbuf, ACCT_FMT_2, &cpu, &pid, &ssw, &csw, &xsc, &pf, &state, &account_period, &exectime_period, &exectime_total, name) != ACCT_NFMT_2) { strcpy(name, ""); if (sscanf(acctbuf, ACCT_FMT_1, &cpu, &pid, &ssw, &csw, &xsc, &pf, &state, &account_period, &exectime_period, &exectime_total) != ACCT_NFMT_1) { break; } } snprintf(cmdpath, sizeof(cmdpath), PROC_PID, pid); cmdfp = fopen(cmdpath, "r"); if (cmdfp == NULL || fgets(cmdbuf, sizeof(cmdbuf), cmdfp) == NULL) strcpy(cmdbuf, "-"); if (cmdfp) fclose(cmdfp); v = exectime_total; sec = v / 1000000000LL; v %= 1000000000LL; msec = v / 1000000LL; v %= 1000000LL; usec = v / 1000LL; hr = sec / (60 * 60); sec %= (60 * 60); min = sec / 60; sec %= 60; printf("%-6d %.3u:%.2u:%.2lu.%.3u,%.3u %-24s %s\n", pid, hr, min, sec, msec, usec, name, cmdbuf); } exit(0); }