お手製timeコマンドをつくってみたい
Windowsでもtimeコマンド使いたいなーなんてときがしばしばあるので試しに作ってみようってことで書いてみた。
Windowsだと別の役割を持つtimeコマンドがすでにあるのでtimeitという名前に。
WindowsAPIのCreateProcess関数とGetProcessTimes関数を用いた。
FILETIME構造体は、1601年1月1日から 100 ナノ秒間隔の数を表す二つの 32 ビットメンバを持つ 64 ビットの値で、
typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME;
となっているので、ポインタのキャストで無理やりlong long int にして扱った。
ただ、これはexeファイルしかuserとkernelの時間が測れないという問題がある。内部コマンドやバッチファイルは受け付けてくれない。また、
cmd /c
を先頭に入れると内部コマンドやバッチファイルを走らせることができるが、これだと新しく開いたプロンプトの時間を監視することになるので正しい時間が測れない。
どうしたらいいんでしょう……
参考にしたところ
- ファイル時間情報
- Win32API プロセスに関する時間情報を取得する GetProcessTimes - s-kita’s blog
- Windows previous versions documentation | Microsoft Docs
- Windows previous versions documentation | Microsoft Docs
- CreateProcessによるプログラム起動と制御
等々