ホームページ >バックエンド開発 >PHPチュートリアル >Linux -- ターミナル、ジョブ制御、デーモン
1. プロセスグループ、ジョブ、セッションの概念
1. プロセスグループ: 1 つ以上のプロセスの集合です。通常、同じジョブに関連して、同じ端末からさまざまな信号を受信できます。各プロセスには一意のプロセス グループ ID があります。各プロセス グループはリーダー プロセスを持つことができます。グループ リーダー プロセスのアイデンティティは、そのプロセス グループ ID がそのプロセス ID と等しいことです。グループ リーダー プロセスは、プロセス グループを作成し、グループ内にプロセスを作成して終了できます。プロセスグループ内にプロセスが存在する限り、グループリーダープロセスが終了するかどうかに関係なく、プロセスグループは存在します。
2. ジョブ: シェルはフロントエンドとバックエンドに分かれており、プロセスではなくジョブ(ジョブ)またはプロセスグループを制御します。フォアグラウンド ジョブは複数のプロセスで構成でき、バックグラウンド ジョブも複数のプロセスで構成できます。シェルは、フォアグラウンド ジョブと任意の数のバックグラウンド ジョブ (ジョブ制御と呼ばれます) を実行できます。
ジョブとプロセスグループの違い: ジョブ内のプロセスが子プロセスを作成する場合、子プロセスはジョブに属しません。
ジョブが終了すると、元のフォアグラウンド プロセスがまだ存在する場合 (子プロセスが終了していない場合)、シェルは自動的にバックグラウンド プロセス グループになります。
3. セッション: 1 つ以上のプロセス グループの集合です。セッションには 1 つの制御端末を含めることができます。制御端末との接続を確立するセッションファーストプロセスを制御プロセスと呼びます。セッション内の複数のプロセス グループは、フォアグラウンド プロセス グループと 1 つ以上のバックグラウンド プロセス グループに分割できます。したがって、セッションには、制御プロセス (セッションの最初のプロセス)、フォアグラウンド プロセス グループ、およびバックグラウンド プロセス グループが含まれている必要があります。
**************** (プロセスグループはクラスに相当し、グループリーダーは分隊長に相当します。会話は学年に相当します。各学年には学務室(管理端末))
2. ターミナル
1. ターミナルの概念: ユーザーがターミナルを介してシステムにログインすると、このターミナルはシェル プロセスの制御ターミナルと呼ばれます。特別なデバイス ファイル /dev/tty 制御端末。実際、各端末デバイス
は、異なるデバイス ファイルに対応しており、/dev/tty は、/dev/tty を通じて、または対応する端末デバイス ファイルを通じて、その制御端末にアクセスできます。 ttyname 関数は、ファイル記述子から対応するファイル名を見つけることができます。ファイル記述子は、ファイルではなく端末デバイスを指している必要があります。
******************各種端末に対応したデバイスファイル名を確認してください。
1 #include<stdio.h> 2 #include<unistd.h> 3 int main() 4 { 5 printf("fd: %d -> %s\n",0,ttyname(0)); 6 printf("fd: %d -> %s\n",1,ttyname(1)); 7 printf("fd: %d -> %s\n",2,ttyname(2)); 8 }
2. ターミナルログインプロセス:
通常、PC には 1 組のキーボードとモニター、つまり 1 組の端末機器しかありませんが、Ctrl-Alt-F1~Ctrl を使用して 6 文字のターミナルに切り替えることができます。 -Alt-F6、これは非常に便利です。 6 セットの仮想端末デバイスがあるため、それらは同じ物理端末デバイスのセットを共有し、対応するデバイス ファイルは /dev/tty1~/dev/tty6 であるため、仮想端末と呼ばれます。 。デバイス ファイル /dev/tty0 は、現在の仮想端末を表します。たとえば、Ctrl-Alt-F1 の文字端末に切り替える場合、Ctrl-Alt- の文字端末に切り替える場合、/dev/tty0 は /dev/tty1 を表します。 F2、/dev/tty0 は、/dev/tty と同様のユニバーサル インターフェイスである /dev/tty2 を表しますが、グラフィカル ターミナル ウィンドウに対応する端末を表すことはできません。
a. システムが起動すると、init プロセスは設定ファイル /etc/inittab に基づいてどの端末を開く必要があるかを決定します。
b. Getty は、コマンド ライン パラメーターに従って端末デバイスを制御端末として開き、ファイル記述子 0、1、および 2 を制御端末に指定し、ユーザーにアカウントの入力を求めます。ユーザーがアカウントを入力すると、getty のタスクが完了し、ログイン プログラム
execle("/bin/login", "login", "-p", username, NULL, envp); が実行されます。プロンプト ユーザーはパスワードを入力し (パスワード入力中の端末のエコーをオフにします)、アカウントのパスワードが正しいことを確認します。 パスワードが間違っている場合、ログインプロセスは終了し、init は getty プロセスを再フォーク/実行します。パスワードが正しい場合、ログイン プログラムはいくつかの環境変数を設定し、現在の作業ディレクトリをユーザーのホーム ディレクトリに設定してから、Shell:
execl("/bin/bash", "-bash", NULL);
3 を実行します。 . デーモン プロセス
1. デーモン プロセスは、バックグラウンドで実行される特別なプロセスです。制御端末から独立しており、定期的に何らかのタスクを実行するか、何らかのイベントが発生するのを待ちます。
2. ps axj | grep -E 'd$' を使用して、デーモン プロセスを表示します。
パラメータ a は、現在のユーザーのプロセスだけでなく、他のすべてのユーザーのプロセスもリストされることを意味します。端末を制御するプロセスのみがリストされますが、制御端末を持たないすべてのプロセスもリストされます。 パラメーター j は、ジョブ制御に関連する情報をリストします。
3. デーモン プロセスを作成します
新しいセッションを作成し、セッション リーダーになるために setid 関数を呼び出します (セッションの最初のプロセス)。呼び出しが成功すると、新しく作成されたセッション ID が返され、エラーの場合は -1 が返されます。
a. umask を呼び出してファイルを転送します。モード作成マスクが 0.
b に設定され、fork が呼び出され、親プロセスが終了します (exit)。理由:
1) デーモンが単純なシェル コマンドとして開始された場合、親プロセスが終了すると、シェルはコマンドが実行されたと認識します。
2) 子プロセスがプロセス グループのリーダー プロセスではないことを確認します。
c. setid を呼び出して新しいセッションを作成します。
1) 呼び出しプロセスが新しいセッションの最初のプロセスになります。
2) 呼び出し元のプロセスがプロセスグループのリーダープロセスになります。
3) 呼び出しプロセスには制御端末がありません。 (デーモンプロセスが後で tty デバイスを開かないようにするために、再度フォークします)
d. 現在の作業ディレクトリをルートディレクトリに変更します。
e. 不要になったファイル記述子を閉じます。
f、その他: SIGCHLD シグナルを無視します。
#include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 void mydeamon(void) 5 { 6 pid_t id=fork(); 7 umask(0);//将文件模式创建屏蔽字设置为0. 8 if(id>0) 9 { 10 exit(0);//调用fork,父进程退出(exit) 11 } 12 setsid();//调用setsid创建一个新会话 13 chdir("/");//将当前工作目录更改为根目录。 14 close(0);//关闭不在需要的文件描述符。 15 close(1); 16 close(2); 17 } 18 int main() 19 { 20 mydeamon(); 21 while(1); 22 return 0; 23 }
上記は、Linux の内容です - ターミナル、ジョブ制御、およびデーモン プロセスの詳細については、注意してください。 PHP 中国語 Web サイト (www .php.cn) にアクセスしてください。