hack のためのネタ帳, etc,,,

状況

Cygwin で子プロセス等に SIGSTOP, SIGCONT を kill(2) で投げた際、waitpid(2) で state の変化を拾おうとしたところ、なぜか取りこぼしが生じたり、state が変化しないという状況が生じたので、pid を指定して state (running, sleeping, stopping 等)を得たい。

JM を眺めて見たが、それらしいシステムコールが見当たらない。

解法

/proc/<PID>/status を見ると重そうなので嫌だったのだが、適当な system call が見当たらなかったため、
仕方ないので以下のようにして State: 行の値から最初の 1 文字を拾うようにしてみた。
int getProcState(pid_t pid) {
  int state = 0;
  char fn[32], line[512];
  sprintf(fn, "/proc/%d/status", pid);
  FILE *fp = fopen(fn, "r");
  if (fp) {
    while(fgets(line, sizeof(line), fp)) {
      if (strstr(line, "State:")) {
        state = line[7];
        break;
      }
    }
    fclose(fp);
  }
  return state;
}


20201207: 追記
拾った文字の意味については ps(1) # プロセスの状態コード 参照かな?

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます