Linux

  
での親子プロセスに関するいくつかの考察と結論1.親プロセスはwait()/waitpid()を使って子プロセスの終了を待つことができ、ゾンビ子プロセスの生成を避け、もちろんループ待ちもしません(もちろん待機します)。すべての子プロセスの終了を待つために/watipid();子プロセスの終了時にSIGCHLDシグナルが親プロセスに送信され、親プロセスがsignal()/sigaction()によって子プロセスに応答することが望ましい。キーコードは次のとおりです:signal(SIGCHLD、sigchld_handler); void sigchld_handler(int sig){pid_t pid; intステータス;(;(pid = waitpid(-1、& status、、 WNOHANG))> 0;){printf("子%dが死亡しました:%d \\ n"、pid、WEXITSTATUS(status)); //pid、status);} //while((pid = waitpid( - ) 1、& status、WNOHANG))> 0){} return;}

2.親プロセスが終了すると、終了していない子プロセスは孤立プロセスとなり、システムはinitプロセスを次のように扱います。親プロセス;したがって、親プロセスが終了した後も子プロセスは実行を継続します。

3.親プロセスと子プロセスが共存する場合、SIGINTなどの関連シグナルが生成されると、親プロセスと子プロセスは親プロセスを終了します。プロセスはこのシグナルを受け取ることができますが、親プロセスだけが応答してから親プロセスが子プロセスにこのシグナルを渡しますが、注意が必要な点は、(1)親プロセスがシグナルプロセスの処理をカスタマイズしない場合親プロセスと子プロセスの両方がシグナルのデフォルト処理を受け入れます。たとえば、このシグナルは、SIGINTプロセスのカスタム処理がなく、親プロセスと子プロセスがすぐに中止された場合に生成されます。このシグナルとそのシグナル処理方法;現時点で、子プロセスが孤立プロセスになると、現時点では子プロセスはこのシグナルとそのシグナル処理方法を受け入れられなくなりますTestFork6.cを参照してください、キーコードは次のとおりです。 、sig_handler);(i = 0; i <5; i ++){if(fork()== 0){printf(“ child%d \\ n”、getpid()); sleep(5); //この時点で、SIGINTシグナルに応答して、シグナルが処理された後に、プロセスprintf( "after sleep1:child%d \\ n"; sleep(5); //sleep(5); //この時点で、子プロセスは孤立プロセスになるので、いいえ) SIGINTシグナルprintf( "sleep2の後:子%d \\ n"、getpid()); exit(0)に応答する子プロセスを作成するとき、カーネルは親プロセスの内容の多くを子プロセスにコピーし、fork()を呼び出した後、親プロセスと子プロセスは本体部分を共有します(これはコピーと同じです)。 2つの単語をコピーすることに注意を払うので、あなたが親子プロセス通信方法を使用しない限り、変更されたDongdongは親プロセスに影響を及ぼしません;したがって、動的スペースの解放、メモリシグナルの修正などの子プロセスコードの書き込みに特に注意を払います。例として、TestFork1.cを参照してくださいキーコードは次のとおりです:gets(buf); pid = fork(); if(pid == 0){printf(" child:"); strcpy(buf、" xiaofeng"); //buf here(メインプロセス内のbufのコピー)は、その変更がメインプロセス内のbufの内容に影響しないため、else(メインプロセス)内のbufとは関係ありません。} else {printf(" parent: printf("%s \\ n"、buf); //ステートメントがどのプロセス(親/子プロセス)にあるかによって、ここで出力が実行されます(helloはgets(buf)です。 )ステートメント)hellochild:xiaofengparent:hello


5.シグナルに関するいくつかの結論を追加してください:(1)signal 3つのモードがあり、1つはデフォルトの処理モード、2つ目はシグナル無視モード、3つ目はカスタムシグナル処理方法、(2)プロセスが割り込み可能な優先順位でスリープする場合、プロセスによってキャプチャされたシグナルはプロセスのスリープを中断します。 >

//マルチスレッドLinuxのマルチスレッドモデルの特性を追加、追加します。

Linuxのスレッドは基本的に軽量プロセスであり、対応する世代はスレッドの生成時に生成されます。構造が親スレッドのプロセス制御構造と同じプロセスメモリ空間を共有することを除いて、プロセス制御構造。同時に、新しいスレッドのプロセス制御構造は、ファイルリストのオープンやシグナルブロックマスクなど、親スレッド(プロセス)から同じプロセス情報をコピーします。子スレッドが生成された後にシグナルブロックマスクを変更したので、子スレッドはこの時点でメインスレッドの元のプロセス情報を使用するので、子スレッドは依然としてSIGINTおよびSIGTERMシグナルに反応します。 SIGINTシグナルが使用されると、メインプロセスはシグナルを処理せず、子プロセス(スレッド)はデフォルトの処理、つまりexitを実行します。子プロセスが終了すると、SIGCHLDシグナルを親プロセス(スレッド)に送信し、子プロセスが終了したことを示し、シグナルがブロックされていないため、メインプロセス(スレッド)も即時に終了し、上記の動作が行われます。したがって、この問題に対する1つの解決策は、子スレッドが生成される前にシグナルを設定するか、子スレッドの内部にシグナルを設定することです。子スレッドはトランザクション関数であることが多いため、単純な場合には前者を使用することをお勧めします処理されるシグナルがより複雑な場合は、後者の方法を使用する必要があります。


-------------------------------------- ----補足:Zombie Process

Unix:Zombie Process

このプロセスのライフサイクルには、スリープ、実行可能、停止、実行中、および停止状態のいくつかの状態があります。 。いわゆるゾンビプロセスとは、プロセスが終了し、そのメモリと関連リソースがカーネルによって解放されているが、プロセスエントリがまだプロセステーブルにあるため、その親プロセスが終了ステータスを取得することを意味します。 。プロセスが終了すると、その親プロセスはSIGCHLDシグナルを受け取ります。一般に、このシグナルのハンドルは通常waitシステムコールを実行するため、デッド状態のプロセスは削除されます。親プロセスがこれを行わない場合、結果はどうなりますか?プロセスがゾンビの状態になることは間違いありません。実際、ゾンビプロセスはシステムをあまり傷つけません、せいぜいプロセス番号(PID)とプロセステーブルのプロセス項目システムは使用できません。

親プロセスが子プロセスを分岐させてから、両方とも独自のコードを実行し、ある時点で、子プロセスは終了します。しかし、現時点では、子プロセスにはまだある程度のスペースがあり、オペレーティングシステムではリサイクルされていません。
親プロセスは、一連の待機のシステムコールを使用して子プロセスをリサイクルする必要があるため、子プロセスはシステムから完全に消えることができます。そのため、ゾンビプロセスは、子プロセスが親プロセスによってリサイクルされる前に終了するまでの時間です。

子プロセスが死んだ後、SIGCHLDシグナルを親プロセスに送ります。

Copyright © Windowsの知識 All Rights Reserved