bekkou68 の日記

Gogengo! や IT 技術など。

『Working with Unix Processes』の Process Have IDs を読みました

はじめに

『Working with Unix Processes』を社内勉強会で読んでます。 引き続きメモです。

メモ

プロセスには ID がシーケンシャルにふられて Kernel がそれを管理する。ID というシンプルなものだからこそプログラムで扱いやすいものになっている。Ruby では Process.pid でプロセスID を取得できる。ちなみに $$ っていう便利な書き方あるけど、Process.pid のほうが意図が伝わるからリーダブルだよね。

気になったこと

ps コマンドをいじってたら「ps aux はなぜハイフンを付けなくていいのか」という疑問が場から出てきたので調べてみました。困ったときの man。

$ man ps
(snip)
The biggest change is in the interpretation of the -u option, which now displays processes belonging to the specified username(s).  Thus,
"ps -aux" will fail (unless you want to know about user "x").  As a convenience, however, "ps aux" still works as it did in Tiger.

どうやら -u オプションの解釈の仕方が変わったことが影響しているようです。以前の -u オプションは

     -u      Display information associated with the following keywords: user, pid, %cpu, %mem, vsz, rss, tt, state, start,
             time, and command.  The -u option implies the -r option.

と、表示する情報を変えるものであったのに対し、新しい -u オプションは

     -u      Display the processes belonging to the specified usernames.

と、ユーザを指定して結果をしぼりこむようになりました。これによって -u のあとに x をつけるとユーザx を解釈されるようになりました。オプションの衝突が起きたのですね。ただし、利便性のため "ps aux" という形でなら実行できるようになっているそうです。へ〜。

試したこと

システムコール getpid を C言語から呼べることを確認しました。

// なくても動いたがコンパイル時に警告が出た
#include <stdio.h>

// なくても動いた。man getpid すると include してねと書いてある。
// 元々コンパイル時に含まれるようになってるのかな?
#include <unistd.h>

main() {
  printf("%d", getpid());
}

実行。

$ ./a.out
47337

出た! C言語ひさびさに書いた><

フレーズ

  • generic representation: 一般的表現
  • imperative: 欠かせない
  • cross reference: 相互参照、見比べてみよう的な?