TVアニメ「キルラキル」最新PV
アニメ『キルラキル』(2013)
バトルものはつい視聴を止められなくなってしまいます。
アニメは一日数時間、と決めて強い意志で見ないと、寝不足になって仕方がありません。
戦闘能力は、装備に依存するのは当たり前なのですが、露出部分が大半なのに強くなる仕組みってところが、面白さを増してます。聖闘士星矢のクロス的な。
今回はキルつながりでkillコマンドです。
killコマンドって内部で何をしているのでしょう。プロセスが係るので、最終的にはシステムコールするしかないような気がします。
まず普段使ってるkillコマンドが内部かどうか確認。
takk@deb9:~$ type kill kill はシェル組み込み関数です takk@deb9:~$
内部コマンドでした。ですので、helpで使い方が確認できます。
akk@deb9:~$ help kill kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... または kill -l [sigspec] Send a signal to a job. Send the processes identified by PID or JOBSPEC the signal named by SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then SIGTERM is assumed. Options: -s sig SIG is a signal name -n sig SIG is a signal number -l list the signal names; if arguments follow `-l' they are assumed to be signal numbers for which names should be listed -L synonym for -l Kill is a shell builtin for two reasons: it allows job IDs to be used instead of process IDs, and allows processes to be killed if the limit on processes that you can create is reached. Exit Status: Returns success unless an invalid option is given or an error occurs. takk@deb9:~$
このヘルプの文言から、ソース検索してみます。
takk@deb9:~/src/bash-4.4$ grep 'Kill is a shell' -r * --exclude-dir {po,tests} builtins/kill.def:Kill is a shell builtin for two reasons: it allows job IDs to be used takk@deb9:~/src/bash-4.4$
kill.defにありそうです。getoptsと同じく.defファイルになってます。
次は、kill.defからpidを使用している箇所を探します。pidという名称がどこから来たのかというと、単に感です。プロセスをkillするなら、当然pidを使っているだろう、と。
takk@deb9:~/src/bash-4.4$ grep -n pid builtins/kill.def 25:$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 75:static void kill_error __P((pid_t, int)); 92: pid_t pid; 93: intmax_t pid_value; 184: if (*word && legal_number (list->word->word, &pid_value) && (pid_value == (pid_t)pid_value)) 186: pid = (pid_t) pid_value; 188: if (kill_pid (pid, sig, pid < -1) < 0) 193: kill_error (pid, errno); 226: to be careful. We take the pid of the first job in the pipeline 228: pid = IS_JOBCONTROL (job) ? j->pgrp : j->pipe->pid; 232: if (kill_pid (pid, sig, 1) < 0) 237: kill_error (pid, errno); 246: sh_badpid (list->word->word); 257:kill_error (pid, e) 258: pid_t pid; 266: builtin_error ("(%ld) - %s", (long)pid, x); takk@deb9:~/src/bash-4.4$
188,232行目のkill_pidでプロセスをkillしてるっぽいですね。
さらにkill_pidで検索します。
takk@deb9:~/src/bash-4.4$ grep kill_pid -r * builtins/kill.def: if (kill_pid (pid, sig, pid < -1) < 0) builtins/kill.def: if (kill_pid (pid, sig, 1) < 0) jobs.c:kill_pid (pid, sig, group) jobs.h:extern int kill_pid __P((pid_t, int, int)); nojobs.c:kill_pid (pid, signal, group) takk@deb9:~/src/bash-4.4$
jobs.cにkill_pidの本体があるようです。
さらに検索。
takk@deb9:~/src/bash-4.4$ grep -n 'pid.*sig' jobs.c 3340:kill_pid (pid, sig, group) 3370: result = killpg (pid, sig); 3380: kill (p->pid, sig); 3403: result = killpg (pid, sig); 3408: result = kill (pid, sig); 3519: if (pid < 0 && errno == EINTR && wait_sigint_received) 4306: kill (getpid (), sig); takk@deb9:~/src/bash-4.4$
どうも内部では、killpgやkillを使っており、結局これはシステムコールやライブラリってことになりますね。
man 2 kill。
takk@deb9:~/src/bash-4.4$ (LANG=C;man 2 kill | head) KILL(2) Linux Programmer's Manual KILL(2) NAME kill - send signal to a process SYNOPSIS #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); takk@deb9:~/src/bash-4.4$
man 3 killpg。
takk@deb9:~/src/bash-4.4$ (LANG=C;man 3 killpg | head) KILLPG(3) Linux Programmer's Manual KILLPG(3) NAME killpg - send signal to a process group SYNOPSIS #include <signal.h> int killpg(int pgrp, int sig); takk@deb9:~/src/bash-4.4$
システムコールだけではなく、ライブラリコールもありましたが、結局はプロセス操作するのに、あるものを使うしかないってことが分かりました。
コメント