timeもどき
なんかCygwin bashのtimeコマンドがまともな結果を返さないので、自分で作りました。
エラーチェックがテキトーとか、分の表示が0固定とか、やっつけコードですが、貼っときます。
#include <stdio.h> #include <stdlib.h> #include <windows.h> FILETIME diff_time(const FILETIME* lhs, const FILETIME* rhs) { FILETIME ft; ft.dwHighDateTime = lhs->dwHighDateTime - rhs->dwHighDateTime; if (lhs->dwLowDateTime < rhs->dwLowDateTime) ft.dwHighDateTime--; ft.dwLowDateTime = lhs->dwLowDateTime - rhs->dwLowDateTime; return ft; } unsigned to_msec(const FILETIME* ft) { return ft->dwLowDateTime / 10000; } unsigned to_sec(const FILETIME* ft) { return ft->dwLowDateTime / 10000000; } int main(int argc, char* argv[]) { STARTUPINFO params = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION info; FILETIME start = {0,0}; FILETIME end = {0,0}; FILETIME kernel = {0,0}; FILETIME user = {0,0}; FILETIME real = {0,0}; const char* cmdline; const char* delim; char* cmdline_buf; DWORD code; cmdline = GetCommandLine(); delim = strchr(cmdline, ' '); while (*delim == ' ') ++delim; cmdline_buf = malloc(strlen(delim)+2); strcpy(cmdline_buf, delim); params.dwFlags = STARTF_USESTDHANDLES; params.hStdInput = GetStdHandle(STD_INPUT_HANDLE); params.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); params.hStdError = GetStdHandle(STD_ERROR_HANDLE); if (CreateProcess(0, cmdline_buf, 0, 0, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, ¶ms, &info) == TRUE) { CloseHandle(info.hThread); WaitForSingleObject(info.hProcess, INFINITE); GetProcessTimes(info.hProcess, &start, &end, &kernel, &user); GetExitCodeProcess(info.hProcess, &code); CloseHandle(info.hProcess); real = diff_time(&end, &start); printf("real 0m%u.%03us\n", to_sec(&real), to_msec(&real) % 1000u); printf("user 0m%u.%03us\n", to_sec(&user), to_msec(&user) % 1000u); printf("sys 0m%u.%03us\n", to_sec(&kernel), to_msec(&kernel) % 1000u); } else printf("error=%u\n", GetLastError()); free(cmdline_buf); return (int)code; }
なお、実行ファイル名をtime.exeとした場合、「.exe」を省略して実行するとcmd.exeの内部コマンドが呼ばれるので注意してください。
↑ディレクトリを付けないとダメでした。ファイル名を変えたほうがいいです。