きららファンタジア 「キルミーベイベー」参戦決定CM
アニメ『キルミーベイベー』
四コマ原作なので、少しずつ見るのにちょうどよいです。くすっと笑えます。
というか、きららファンタジアが気になってしょうがないので、スマホにインストールしてプレイしようとしたのですが、運悪くメンテナンス中でプレイできず。夜中にまたトライしてみます。
今回は外部コマンドのkillのソースを見てみます。
コマンドのパスを確認
takk@deb9:~/src$ which kill /bin/kill takk@deb9:~/src$
フルパスでパッケージ検索。
takk@deb9:~/src$ apt-file search /bin/kill avarice: /usr/bin/kill-avarice ctn: /usr/bin/kill_ctndisp ctn: /usr/bin/kill_ctnnetwork ion: /usr/bin/killm klibc-utils: /usr/lib/klibc/bin/kill le-dico-de-rene-cougnenc: /usr/bin/killposte procps: /bin/kill psmisc: /usr/bin/killall takk@deb9:~/src$
procpsですね。
ソース取得。
takk@deb9:~/src$ apt-get source procps takk@deb9:~/src$ ls procps-3.3.12 procps_3.3.12-3.dsc procps_3.3.12-3.debian.tar.xz procps_3.3.12.orig.tar.xz takk@deb9:~/src$ cd procps-3.3.12/ takk@deb9:~/src/procps-3.3.12$
ソースの場所を特定するため、例によってユニークな文言を探します。
takk@deb9:~/src/procps-3.3.12$ /bin/kill -h Usage: kill [options] <pid> [...] Options: <pid> [...] send signal to every <pid> listed -<signal>, -s, --signal <signal> specify the <signal> to be sent -l, --list=[<signal>] list all signal names, or convert one to a name -L, --table list all signal names in a nice table -h, --help display this help and exit -V, --version output version information and exit For more details see kill(1). takk@deb9:~/src/procps-3.3.12$
検索します。
takk@deb9:~/src/procps-3.3.12$ grep 'convert one to a name' -r * --exclude-dir={po,testsuite} skill.c: fputs(_(" -l, --list=[<signal>] list all signal names, or convert one to a name\n"), out); takk@deb9:~/src/procps-3.3.12$
skill.cっぽいです。killコマンドが実行されたときに、HELLOと表示するように修正。これが表示されたら、このソースで確定です。
takk@deb9:~/src/procps-3.3.12$ cat -n skill.c ~省略~ 418 static void __attribute__ ((__noreturn__)) 419 kill_main(int argc, char **argv) 420 { 421 int signo, i; 422 int loop = 1; 423 long pid; 424 int exitvalue = EXIT_SUCCESS; 425 426 static const struct option longopts[] = { 427 {"list", optional_argument, NULL, 'l'}, 428 {"table", no_argument, NULL, 'L'}, 429 {"signal", required_argument, NULL, 's'}, 430 {"help", no_argument, NULL, 'h'}, 431 {"version", no_argument, NULL, 'V'}, 432 {NULL, 0, NULL, 0} 433 }; 434 printf("HELLO\n"); 435 setlocale (LC_ALL, ""); 436 bindtextdomain(PACKAGE, LOCALEDIR); ~省略~
ビルドします。
takk@deb9:~/src/procps-3.3.12$ ./configure takk@deb9:~/src/procps-3.3.12$ make
killという実行ファイルが生成されました。実行します。
takk@deb9:~/src/procps-3.3.12$ ./kill HELLO Usage: kill [options] <pid> [...] ~省略~ takk@deb9:~/src/procps-3.3.12$
HELLOが表示されたので、このファイルで間違いないです。
では、このファイルの中のシステムコールkillを使用している箇所を検索します。
全部見なくても、周辺みればなんとなく処理は分かるかと思います。
takk@deb9:~/src/procps-3.3.12$ grep -n 'kill.*pid' -C3 skill.c 147- /* do the actual work */ 148- errno = 0; 149- if (program == PROG_SKILL) 150: failed = kill(pid, sig_or_pri); 151- else 152- failed = setpriority(PRIO_PROCESS, pid, sig_or_pri); 153- if ((run_time->warnings && failed) || run_time->debugging || run_time->verbose) { -- 480- /* Special case for signal digit negative 481- * PIDs */ 482- pid = atoi(argv[optind]); 483: if (kill((pid_t)pid, signo) != 0) 484- exitvalue = EXIT_FAILURE; 485- exit(exitvalue); 486- } -- 498- 499- for (i = 0; i < argc; i++) { 500- pid = strtol_or_err(argv[i], _("failed to parse argument")); 501: if (!kill((pid_t) pid, signo)) 502- continue; 503- error(0, errno, "(%ld)", pid); 504- exitvalue = EXIT_FAILURE; takk@deb9:~/src/procps-3.3.12$
なるほど、普段killを使うことが少ないので知りませんでしたが、プロセスIDは複数指定することができるんですね。
試してみます。sleepコマンドを3つ実行。
takk@deb9:~/src/procps-3.3.12$ sleep 10000 & [1] 23710 takk@deb9:~/src/procps-3.3.12$ sleep 10000 & [2] 23711 takk@deb9:~/src/procps-3.3.12$ sleep 10000 & [3] 23712 takk@deb9:~/src/procps-3.3.12$ ps PID TTY TIME CMD 14801 pts/0 00:00:00 bash 23710 pts/0 00:00:00 sleep 23711 pts/0 00:00:00 sleep 23712 pts/0 00:00:00 sleep 23713 pts/0 00:00:00 ps takk@deb9:~/src/procps-3.3.12$
では、複数PIDを指定してkillコマンドを実行します。
takk@deb9:~/src/procps-3.3.12$ kill 23710 23711 23712 takk@deb9:~/src/procps-3.3.12$ ps PID TTY TIME CMD 14801 pts/0 00:00:00 bash 23716 pts/0 00:00:00 ps [1] Terminated sleep 10000 [2]- Terminated sleep 10000 [3]+ Terminated sleep 10000 takk@deb9:~/src/procps-3.3.12$
少しだけ賢くなれました。
コメント