psコマンドのオプションをソースで確認


アニメ『すのはら荘の管理人さん』

いまいち楽しみ方がわからないアニメ。ほのぼのすれば良いのだろうけど、主人公が女の子のような男の子である必要性とか、管理人さんはタイトルになってるけど、なんだか他のキャラと同列のような、と気になりはじめ、原作読んでみることになりました。
原作は4コマ漫画ですが、アニメと同じ内容なのだけど、漫画の方が断然面白いです。
何がって、絵が止まってるところ。アニメは初見だと、キャラを把握してないのにどんどん話が進みますが、漫画ではキャラの紹介シーンで、ずっと止まって眺めてられます。
まあ漫画を読んでから、アニメを見るって楽しみ方も良いと思います。

今回は、管理ということでpsコマンドやります。
psコマンドは、-ハイフンありオプションと、ハイフンなしオプションが混在していて、かつオプションが大量にあります。どのようなオプション解析のソースになっているか気になります。

ということでpsコマンドのソースを確認します。
psのパスを確認。

takk@deb9:~/src$ which ps
/bin/ps
takk@deb9:~/src$ 

パスからapt-file search。apt-file searchで指定するパスに正規表現が使えないので、grepをつかって絞り込みします。

takk@deb9:~/src$ apt-file search /bin/ps | grep ps$
ghostscript: /usr/bin/ps2ps
procps: /bin/ps
ps2eps: /usr/bin/ps2eps
psutils: /usr/bin/pstops
takk@deb9:~/src$ 

/bin/psに該当するのは、procpsですね。
パッケージが分かったので、ソース取得します。

takk@deb9:~/src$ apt-get source procps

省略

takk@deb9:~/src$ 

ダウンロードしたパッケージのディレクトリを確認。

takk@deb9:~/src$ cd procps-3.3.12/
takk@deb9:~/src/procps-3.3.12$ ls
ABOUT-NLS      config.rpath  m4             ps             tload.1
AUTHORS        config.sub    man-po         pwdx.1         tload.c
COPYING        configure     misc           pwdx.c         top
COPYING.LIB    configure.ac  missing        skill.1        uptime.1
ChangeLog      contrib       mkinstalldirs  skill.c        uptime.c
Documentation  debian        pgrep.1        slabtop.1      vmstat.8
Makefile.am    depcomp       pgrep.c        slabtop.c      vmstat.c
Makefile.in    free.1        pidof.1        snice.1        w.1
NEWS           free.c        pidof.c        sysctl.8       w.c
aclocal.m4     include       pkill.1        sysctl.c       watch.1
autogen.sh     install-sh    pmap.1         sysctl.conf    watch.c
compile        kill.1        pmap.c         sysctl.conf.5
config.guess   lib           po             test-driver
config.h.in    ltmain.sh     proc           testsuite
takk@deb9:~/src/procps-3.3.12$ 

さっそくgrep。caseの’a’オプションを検索。

takk@deb9:~/src/procps-3.3.12$ grep -r 'case.*a.:' *
contrib/minimal.c:    case 'a':
contrib/utmp.c:    case 'a':
pgrep.c:		case 'a':
pmap.c:		case 'a':	/* Sun prints anon/swap reservations */
proc/readproc.c:    case_VmSwap: // Linux 2.6.34
proc/readproc.c:    case_VmPeak: // 2005, peak VmSize unless VmSize is bigger
ps/parser.c:    case 'a':
ps/parser.c:    case 'a':
ps/parser.c:  case_format:
ps/global.c:  case_debian:  /* Toss this? They don't seem to care much. */
ps/global.c:  case_compaq:
ps/global.c:  case_digital:
ps/sortformat.c:    case SF_B_o: case SF_G_format: case SF_U_o: /*** format ***/
slabtop.c:	case 'a':
sysctl.c:		case 'a':	/* string and integer values (for Linux, all of them) */
top/top.c:         case 'a':
top/top.c:            case 'a':                          // 3.2.8 (former procps)
top/top.c:      case 'a':                   // we don't carry 'a' / 'w' in our
top/top.c:         case 'a':
top/top.c:      case 'a':
vmstat.c:		case 'a':
takk@deb9:~/src/procps-3.3.12$ 

psコマンドのオプション解析してそうなファイルとしては、ps/parser.cが怪しいので、
ps/parser.c内の、case ‘オプション’:を確認。

takk@deb9:~/src/procps-3.3.12$ grep "case.*'.':" ps/parser.c
    case ' ': case ',': case '\t': case '\0':
    case 'A':
    case 'C': /* end */
    case 'F':  /* DYNIX/ptx -f plus sz,rss,psr=ENG between c and stime */
    case 'G': /* end */
    case 'H':     /* another nice HP/UX feature */
    case 'J':  // specify list of job IDs in hex (IRIX) -- like HP "-R" maybe?
    case 'L':  /*  */
    case 'M':  // typically the SELinux context
    case 'N':
    case 'O': /* end */
    case 'P':     /* SunOS 5 "psr" or unknown HP/UX feature */
    case 'R':    // unknown HP/UX feature, like IRIX "-J" maybe?
    case 'T':
    case 'U': /* end */
    case 'V': /* single */
    case 'Z':     /* full Mandatory Access Control level info */
    case 'a':
    case 'c':
    case 'd':
    case 'e':
    case 'f':
    case 'g': /* end */
    case 'j':
    case 'l':
    case 'm':
    case 'o': /* end */
    case 'p': /* end */
    case 'q': /* end */
    case 'r':
    case 's': /* end */
    case 't': /* end */
    case 'u': /* end */
    case 'w':
    case 'x':  /* behind personality until "ps -ax" habit is uncommon */
    case 'y':  /* Sun's -l hack (also: Irix "lnode" resource control info) */
    case 'z':     /* alias of Mandatory Access Control level info */
    case 'z':     /* select by zone */
    case '-':
    case '0' ... '9': /* end */
    case 'A':
    case 'C':
    case 'H':    // The FreeBSD way (NetBSD:s OpenBSD:k FreeBSD:H  -- NIH???)
    case 'L': /* single */
    case 'M':   // undocumented for now: these are proliferating!
    case 'O': /* end */
    case 'S':
    case 'T':
    case 'U': /* end */
    case 'V': /* single */
    case 'W':
    case 'X':
    case 'Z':  /* FreeBSD does MAC like SGI's Irix does it */
    case 'a':
    case 'c':
//  case 'd':
    case 'e':
    case 'f':
    case 'g':
    case 'h':
    case 'j':
    case 'k':
    case 'l':
    case 'm':
    case 'n':
    case 'o': /* end */
    case 'p': /* end */
    case 'q': /* end */
    case 'r':
    case 's':
    case 't': /* end */
    case 'u':
    case 'v':
    case 'w':
    case 'x':
    case '-':
  case '=': case ':':
    case '-':  err = parse_pid(++data, grpnode->u + grpnode->n++); break;
    case '+':  err = parse_pid(++data, sidnode->u + sidnode->n++); break;
takk@deb9:~/src/procps-3.3.12$

ものすごいたくさんヒットしました。

つづく

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA