目次
1. exit( ) / _exit( ) で終了し、終了値を渡す
2.子プロセスの解放値wait/waitpidで親プロセスをブロックさせて子プロセスの終了値を待ち、ちなみに死体回収
2.子プロセスの終了ステータスを処理するには、次のマクロを使用してさらに分析できます
1. 他のプログラムを再印刷して実行する (exec)
1.関数実行
2.コード
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
// 产生一个子进程
pid_t pid = fork( );
if (pid > 0 ) // 当前为父进程
{
printf("我是你 大爷 !!我孙子的ID 是:%d \n" , pid );
}
else
{
printf("我是你 二大爷 我自己的ID 是:%d !!\n" , getpid() );
execlp("cp" , "cp" , "fork-1.c" , "a.c" , NULL );
}
return 0;
}
ファイルがカウントされます
3.フォーム
execl("./num" , "num" , NULL ); // 使用execl 函数进行转载新的可执行文件
execv( "./num" , argv ); // 转载新的可执行文件并运行
execl("/bin/cp" , "cp" , "fork-1.c" , "a.c" , NULL );
execlp("cp" , "cp" , "fork-1.c" , "a.c" , NULL );
4. 知識ポイント
exec 関数が実行された後、プロセスのメモリ空間はどうなりますか? - 新しい実行可能ファイルによって再初期化されます
exec関数が実行された後、スレッドの後ろのステートメントは実行されません
次に、子プロセスが終了します
1. exit( ) / _exit( ) で終了し、終了値を渡す
2.子プロセスの解放値wait/waitpidで親プロセスをブロックさせて子プロセスの終了値を待ち、ちなみに死体回収
3.コード
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
printf("Hello ") ;
exit(0);//程序会输出Hello
_exit(0);//程序不会输出Hello
}
4.注意する
- ステータスは、プロセスが終了した後にプロセスの本体に保存され、親プロセスが受け入れて解析するのを待つ必要があります
- プロセスが終了すると、死体が生成され (ゾンビ状態と呼ばれます - メモリを占有します)、親プロセスが処理して死に設定するのを待つ必要があります (メモリを占有しません)。
三、待機機能
1. 待機の説明
2.子プロセスの終了ステータスを処理するには、次のマクロを使用してさらに分析できます
3.コード
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int pid = fork();
int stat_loc ;
if ( pid > 0 )
{
printf("我是你大爷 你的ID:%d\n" , pid);
wait(&stat_loc); // 阻塞等待子进程退出
printf("子进程已经退出...\n");
if(WIFEXITED(stat_loc))
{
printf("子进程正常退出,退出值为:%d\n" , WEXITSTATUS(stat_loc));
}
else if (WIFSIGNALED(stat_loc) )
{
printf("子进程异常退出,被信号杀死:%d\n" , WTERMSIG(stat_loc));
printf("退出值为:%d\n" , WEXITSTATUS(stat_loc));
}
}
else{
printf("我是二大爷 我的ID:%d\n" , getpid());
sleep(1);
exit(257);
}
return 0;
}
4. 考える
子プロセスが終了するときの終了値の値の範囲は?
0 ~ 255 は 8 ビットと 1 バイトを占有します
4. 処理状況
準備完了状態 | 1. ユーザーまたはその親プロセスによって実行され、fork が正常に呼び出され、共通プロセスが準備完了状態に入る 2.実行されていません 3. 優先順位に従って列に並ぶのが本質 |
走行状態 | 1.CPU上で実行 2. 実行中の状態で、タイム スライスが使い果たされると、プロセスは準備完了状態でキューの最後に戻り、再び並んで待機します。 3. 優先度の高いプロセスによって時間がプリエンプトされた場合、プロセスは待機状態のキューの先頭に戻ります。 4. 実行中の状態で、リソースが一時的に利用できない場合、サスペンド/スリープ状態になります |
スリープ/サスペンド | 1. リソースが一時的に利用できない 2. ユーザーが seelp 関数を使用する 3、TASK_INTERRUPIBLE または TASK_UNINTERRUPIBLE TASK_INTERRUPIBLE ライト スリープ。プロセスはこの状態でシグナルなしでウェイクアップできます (たとえば、ファイルのリソースを待機している場合、リソースが利用可能になると、シグナルが生成されてウェイクアップします)。 4. TASK_UNINTERRUPIBLE は一部のハードウェア、ディープ スリープに関連しており、スリープ中は信号に応答しません。 |
一時停止状態 | 1. プロセスは、SIGSTOP または SIGTSTP のいずれかを受け取ると、実行中の状態から一時停止中の状態に変わります。 2. この状態では、システムのスケジューリングに参加しないでください。 3. SIGCONT がシステム プロセスのスケジューリングに再び参加するまで待ちます。 |
ゾンビ状態 | 1. プロセスが終了すると (main 関数が return に遭遇するか、exit を呼び出すなど)、プロセスは終了し、ゾンビ状態に入ります。 2. ゾンビ状態の死体には、真偽、終了値/異常終了、終了理由/シグナルキル、シグナル値など、さまざまな状態と終了情報が格納されます。 3. 親プロセスが子プロセスの死体を表示し、その中のデータを取得するのを待ちます 4. 親プロセスが子プロセスの終了情報を正常に取得すると、ゾンビを終了状態に設定します (本当に死にます)。 |
死亡状態 | 1. 親プロセスは、プロセスの状態をデッド状態に設定するために、wait( ) / waitpid( ) を呼び出して、子の「死亡情報」を確認する必要があります。 2. 親プロセスが事前にハングアップしていた場合、そのプロセスは親プロセスによって受け入れられ、処理されます (INIT) |