1フォーク機能
1.1フォーク機能の使い方の紹介
関数のプロトタイプ:pid_t fork(void)pid_tは、返された識別子であり、異なるプラットフォームでは異なる方法で定義されている場合があり、intまたはlong型などである場合があります。
pid_t pid = fork();
if (pid == 0) {//子进程
}
if(pid>0){ //父进程,此时pid的值是子进程的id号
}
if(pid==-1){ //此时创建子进程失败
}
フォークの作成プロセスが失敗する理由:プロセス数が制限を超えているか、メモリ領域が不足しています
1.2フォークがプロセス空間共有の問題を作成する
最初は、forkによって作成された子プロセスは、pcbを除いて親プロセスとは異なります。残りのスペースは、読み取り時にコピーされ、書き込み時にコピーされます。ファイル記述子は共有されます。
1.3子プロセスの作成によって引き起こされるゾンビプロセスと孤立プロセスの問題
ゾンビプロセス:子プロセスが親プロセスの前に終了した後、子プロセスPCBはその親プロセスを解放する必要がありますが、親プロセスは子プロセスPCBを解放しません。このような子プロセスはゾンビプロセスと呼ばれます。ゾンビプロセスは実際にはプロセスは停止していますが、メモリ領域を占有しています
孤立プロセス:親プロセスは、1つ以上の子プロセスがまだ実行されているときに終了します。その後、それらの子プロセスは孤立プロセスになります。孤立プロセスはinitプロセス(プロセス番号1)によって採用され、initプロセスはそれらのステータス収集作業を完了し、実行中のシステムに損傷を与えるゾンビプロセスのようにIDを占有しません。
ゾンビプロセスを解決する方法:
- 親プロセスを強制終了すると、子プロセスのリソースはinitプロセスによって回復されますが、通常、親プロセスはサーバープログラムです。この暴力的な方法を使用することはできません
- 親プロセスでwaitまたはwaitpid関数を使用します。リソースを再利用するためにwait関数を使用すると、親プロセスがブロックされます。waitpid関数を適切に使用しても、親プロセスはブロックされません。
- シグナル処理を使用すると、子プロセスが終了すると、親プロセスと同様にSIGCHLDシグナルが送信されるため、プログラムの開始時にこのシグナルの処理方法を設定できますが、複数のシグナルが同時に到着すると、シグナルが失われる可能性があります。
2 wait関数とwaitpid関数
2.1はじめに
プロセスが終了すると、すべてのファイル記述子を閉じ、ユーザー空間に割り当てられたメモリを解放しますが、PCBはそれを保持します。カーネルはその中にいくつかの情報を保存します。プロセスが正常に終了した場合、異常終了した場合、終了ステータスが保存されます。次に、プロセスを終了させたシグナルが保存されます。このプロセスの親プロセスは、waitまたはwaitpidを呼び出してこの情報を取得し、プロセスを完全にクリアできます。
2.1待つ
この関数には3つの関数があります。
- 子プロセスが終了するのを待つブロック
- サブプロセスの残りのリソースを再利用する
- 子プロセスの終了ステータス(終了理由)を取得します。
waitが呼び出されると、子プロセスが終了するまでここでブロックされます
関数プロトタイプ:
pid_t wait(int *status); //如果不关心程序退出的状态,可以传入NULL
成功:清理掉的子进程ID;失败:-1 (没有子进程)
プロセスの終了ステータス(正常終了→終了値、異常終了→終了シグナル)を保存するには、関数waitを使用してパラメーターstatusを渡します。プロセス終了の特定の原因をさらに特定するマクロ関数の助けを借りて、マクロ関数はLinuxのmanコマンドを参照します
2.2 waitpid
関数プロトタイプ:
pid_t waitpid(pid_t pid,int *status,int options);
//第一个参数
pid<-1 等待进程组号为pid绝对值的任何子进程
pid=-1 等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
pid=0 等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
pid>0 等待进程号为pid的子进程。
//第二个参数需要搭配具体的宏函数来获得其状态,如果不关心具体的状态则传入NULL
//第三个参数,其参数可以用 “|” 运算符连接起来使用。
WNOHANG 如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED 如果子进程进入暂停状态,则马上返回。
waitpid()関数が正常に実行されると、子プロセスのプロセス番号が返され、エラーが発生すると、-1が返され、失敗の原因がerrno変数に格納されます。
失敗の主な理由は次のとおりです。子プロセスがない(errnoがECHILDに設定されている)、呼び出しがシグナルによって中断された(errnoがEINTRに設定されている)、またはオプションパラメーターが無効(errnoがEINVALに設定されている)
waitpid(-1、ステータス、0)待機(ステータス)と同等の縮退
3実行機能クラスター
参考ブログ:https : //blog.csdn.net/amoscykl/article/details/80354052