プロセスがpid
を使用して別のプロセスの子/孫であるかどうかをどのように識別しますか?プロセスが親子かどうかを知る方法
答えて
プロセスID:チャイルドと親がすべての実行中のプログラムは、固有のプロセスIDを持っている
を処理します。 process ID、 負の整数ではなく、 の場合は常にのプロセスの唯一の識別子です。しかし、プロセスIDは再利用されます。
プロセスが終了すると、IDが再利用できるようになります。ある種の システムでは、再利用が遅れるため、新しく作成されたプロセスは古いものと混同しないようにしてください。
特定のIDは、スケジューラプロセスなど、 システムプロセスによって使用されているという意味で「予約済み」です。別の例は、 のプロセスが常にPID 1を占めるプロセスです。システムによっては、 IDがアクティブに予約されている可能性があります。コマンド
> ps -eaf | head -n 5
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:49 ? 00:00:02 /sbin/init splash
root 2 0 0 11:49 ? 00:00:00 [kthreadd]
root 3 2 0 11:49 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 11:49 ? 00:00:00 [kworker/0:0H]
と
> pidof init
1
を実行
は、あなたが独立してこれを確認することができます。 Cで
我々は、プロセスが他のプロセスを作成することができます
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
、 呼び出したプロセスのプロセスIDと呼び出し元プロセスの親プロセスIDを取得するには、以下の機能を使用することができます。作成されたプロセスは 「子プロセス」と呼ばれ、作成されたプロセスは 「親プロセス」となります。
我々は関数は親プロセスによって、一度呼び出されfork()
#include <unistd.h>
pid_t fork(void);
システムコールを使用して子プロセスを作成するにはフォーク()
を使用して新しいプロセスを作成する
が、それは を返します。二度。子プロセスの戻り値は0で、親プロセスの戻り値 の値は新しい子のプロセスIDです。
プロセスは複数の子プロセスを持つことができますが、そのすべての子のプロセスIDを取得するためのプロセスのためのシステム コールが存在しないので、 親は子プロセスの戻り値を観測し、使用することができますこれらの識別子を管理するためには 。
プロセスには、親プロセスが1つしかない場合があります。これは、 で、getppid
を呼び出すと常に得られます。
子供は親のコピーあり、それは親の データ領域、ヒープとスタックのコピーを取得します。彼らはを共有しませんこれらの部分の メモリ!我々はプログラムを実行するとき
私たちは、これがどのように動作するか 見るために
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
int main(void) {
int var = 42; // This variable is created on the stack
pid_t pid;
// Two processes are created here
// v~~~~~~~~~~|
if ((pid = fork()) < 0) {
perror("Fork failed");
} else if (pid == 0) { // <- Both processes continue executing here
// This variable gets copied
var++;
printf("This is the child process:\n"
"\t my pid=%d\n"
"\t parent pid=%d\n"
"\t var=%d\n", getpid(), getppid(), var);
} else {
printf("This is the parent process:\n"
"\t my pid=%d\n"
"\t child pid=%d\n"
"\t var=%d\n", getpid(), pid, var);
}
return 0;
}
を次のコードスニペットをコンパイルして実行します私たちは、になっているプロセスについて何らの保証 がないことがわかります最初に実行します。それらは同時に を動作させ、出力を効果的にインターリーブすることさえできる。
$ # Standard compilation
$ gcc -std=c99 -Wall fork_example1.c -o fork_example1
$ # Sometimes the child executes in its entirety first
$ ./fork_example1
This is the child process:
my pid=26485
parent pid=26484
var=43
This is the parent process:
my pid=26484
child pid=26485
var=42
$ # and sometimes the parent executes in its entirety first
$ ./fork_example1
This is the parent process:
my pid=26461
child pid=26462
var=42
This is the child process:
my pid=26462
parent pid=26461
var=43
$ # At times the two might interleave
$ ./fork_example1
This is the parent process:
my pid=26455
This is the child process:
my pid=26456
parent pid=26455
var=43
child pid=26456
var=42
親プロセスIDを表しプロセスIDとPPIDの略 PID。
プロセスID 0はカーネルで使用するために予約されているため、 は0を子のプロセスIDにすることはできません。
多くのシステムでは、これら メモリセグメントの完全なコピーを実行し、代わりにプロセス いずれかが書き込みを行った場合のみコピーが作成されません。当初、共有領域は カーネルによって "読み取り専用"としてマークされ、プロセスがこれらの領域を変更しようとするたびに、カーネル賞はそれぞれ独自のメモリコピーを処理します。
標準出力はバッファリングです。これは完全な例ではありません。
getpid()およびgetppid()関数を使用して、プロセスIDと親プロセスIDを取得します。
- 1. ウィンドウが子ウィンドウか親ウィンドウかどうかを知る方法?
- 2. 親プロセスから子プロセスを取得する方法
- 3. BPMプロセスが成功したかどうか知る方法
- 4. 子プロセスから親プロセスに値を書き込む方法は?
- 5. 環境変数が親プロセスから継承されたかどうかを知る方法?
- 6. 電子メールアドレスが無効かどうかを知る方法?
- 7. 選択したテキストが親を埋めるかどうかを知る方法?
- 8. シェルで親プロセスと子プロセスを削除する方法は?
- 9. cで親プロセスと子プロセスを共有する方法
- 10. 親プロセスの子プロセスのツリーを削除する方法
- 11. 親プロセスに応じて子プロセスを作成する方法は?
- 12. 親プロセスから子プロセスへのWebcamストリーム
- 13. Linuxプロセスで親から子へデータを渡す方法
- 14. 子プロセスから親cmd.exeシェルに値を渡す方法は?
- 15. 子プロセスのシグナルハンドラが提供された後、子プロセスが親プロセスに通知する
- 16. 子プロセスから親プロセスのアドレス空間にアクセスする方法は?
- 17. cytoscape.js - 親ノードに子ノードがあるかどうかを調べる方法
- 18. プロセスが子プロセスであるかどうかを確認する方法はありますか?
- 19. 親子プロセス
- 20. fork()子プロセスと親プロセス
- 21. Linuxの親プロセスから子プロセスを管理するBlueprint?
- 22. 子プロセス内のSIGINTが親プロセスに伝播し、親プロセスを強制終了させないようにするにはどうすればよいですか?
- 23. 子プロセスが親プロセスで変数を設定するのを待つ方法はありますか?
- 24. フォーク()親と子プロセス
- 25. Objective-cでは、子プロセスが実行されているときに、親プロセスが子プロセスを中止するとどうなりますか?
- 26. 子プロセスを実行し、Cで親プロセスを操作する方法は?
- 27. プロセスがビジー状態かどうかを確認する方法
- 28. 親子プロセスの実行を同期する方法は?
- 29. ".exe"プロセスがC++またはC#で書かれているかどうかを知る方法?
- 30. mysqlに子があるかどうかを親に選択
['man 2 getpid'](https://linux.die.net/man/2/getpid) – chrk
' ps -eal | 'PID'と' PPID'(そして 'man ps'も同様に)を検査します。 – alk