ここに体を入れることはあまりありません。
ここに体を入れることはあまりありません。
回答:
プロセスには親(PPID)が必要です。カーネルは、実際のプロセスではないにもかかわらず、少なくともinitなどの実際のプロセスを手作りし、プロセスID 0を自身に付与しています。OSによっては、ps
出力にプロセスとして表示される場合とされない場合がありますが、常に表示されますPPIDとして:
例:Linux:
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:09 ? 00:00:00 /sbin/init
root 2 0 0 09:09 ? 00:00:00 [kthreadd]
root 3 2 0 09:09 ? 00:00:00 [ksoftirqd/0]
...
Solarisの場合:
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Oct 19 ? 0:01 sched
root 5 0 0 Oct 19 ? 11:20 zpool-rpool1
root 1 0 0 Oct 19 ? 0:13 /sbin/init
root 2 0 0 Oct 19 ? 0:07 pageout
root 3 0 1 Oct 19 ? 117:10 fsflush
root 341 1 0 Oct 19 ? 0:15 /usr/lib/hal/hald --daemon=yes
root 9 1 0 Oct 19 ? 0:59 /lib/svc/bin/svc.startd
...
PIDことにも注意してください0
(と-1
とそのことについては、他の負の値)のようにそれらを使用する機能をものに応じて異なる意味を持っているkill
、fork
とwaitpid
。
最後に、init
プロセスには伝統的にpidが与えられますが#1
、OSゾーンの仮想化がSolarisゾーンのように使用される場合、複数のinit
実行が存在する可能性があるため、これは当てはまりません。
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 4733 3949 0 11:07:25 ? 0:26 /lib/svc/bin/svc.configd
root 4731 3949 0 11:07:24 ? 0:06 /lib/svc/bin/svc.startd
root 3949 3949 0 11:07:14 ? 0:00 zsched
daemon 4856 3949 0 11:07:46 ? 0:00 /lib/crypto/kcfd
root 4573 3949 0 11:07:23 ? 0:00 /usr/sbin/init
netcfg 4790 3949 0 11:07:34 ? 0:00 /lib/inet/netcfgd
root 4868 3949 0 11:07:48 ? 0:00 /usr/lib/pfexecd
root 4897 3949 0 11:07:51 ? 0:00 /usr/lib/utmpd
netadm 4980 3949 0 11:07:54 ? 0:01 /lib/inet/nwamd
特別に区別されたプロセスIDを持つ2つのタスクがあります。swapperまたはschedはプロセスID 0を持ち、前の例で示したjlliagreのようにページングを担当し、実際には通常のユーザーモードプロセスではなくカーネルの一部です。
プロセスID 1は通常、システムの起動とシャットダウンを主に担当するinitプロセスです。もともと、プロセスID 1は、技術的な手段によって特別にinit用に予約されていませんでした。カーネルによって呼び出された最初のプロセスであるという自然な結果として、このIDを単に持っていました。最近のUnixシステムには通常、「プロセス」として表示される追加のカーネルコンポーネントがあります。この場合、PID 1はinitプロセス用に積極的に予約され、古いシステムとの一貫性を維持します。
一般に、「null参照」を示すために0がよく使用されます。これは、0の値が存在していても、特別な値を示すために0が必要なため、使用しない可能性があることを意味します。
pid
0のために特別な意味があるkill(2)
、それは意味システムコール自身とのためにwaitpid(2)
、それが意味する私のプロセスグループ内の任意のプロセス少なくともを。言うまでもなく、fork()
戻る0
ということは、私たちが子供の中にいるということです。