Linux システム プログラミング (セッションとプロセス)


序文

この記事では、セッションとプロセスの概念について説明します。セッションは比較的珍しいかもしれませんが、英語名は session です。

1. 会話の概念

Linux では、セッションとは、ユーザーがオペレーティング システムと対話する期間を指します。Linux でのセッションの概念は端末に基づいており、端末は物理端末、仮想端末 (TTY など)、またはリモート接続 (SSH など) にすることができます。
以下是Linux中会话的几个关键概念:

1. 制御端末:
セッションには、通常、入出力用の対話型インターフェイスをユーザーに提供する制御端末があります。ユーザーは、コマンドの入力、プログラムの実行、出力の表示など、制御端末を介してオペレーティング システムと対話します。

2. 端末セッション:
ユーザーは、制御端末上で 1 つ以上の端末セッションを開始できます。各ターミナル セッションは独立したプロセス グループであり、フォアグラウンド プロセス グループと 0 個以上のバックグラウンド プロセス グループが含まれます。

3. フォアグラウンド プロセス グループ:
フォアグラウンド プロセス グループは、現在のユーザーが対話しているプロセス グループです。ユーザーが制御端末からコマンドを入力すると、そのコマンドはフォアグラウンドプロセスグループのフォアグラウンドプロセスに送信されて処理されます。フォアグラウンドになれるプロセス グループは 1 つだけです。

4. バックグラウンド プロセス グループ:
バックグラウンド プロセス グループは、ターミナル セッションで実行されますが、ユーザー入力の対話なしで実行されるプロセス グループです。ユーザーはプロセスをフォアグラウンドからバックグラウンドに切り替えることができ、端末をブロックせずにプロセスをバックグラウンドで実行できるようになります。

5. セッション マネージャー:
Linux は、セッション マネージャーを通じてターミナル セッションを管理します。セッション マネージャーは、セッションの作成と管理、制御端末のセットアップ、およびセッション終了時のリソースのクリーンアップを担当します。

6. セッションのログアウトと切断:
通常、セッションは、ユーザーがログアウトするか端末から切断すると終了します。セッションが終了すると、端末上のすべてのプロセス (フォアグラウンドとバックグラウンド) がクリーンアップして終了するための適切な信号を受信します。

セッションは Linux の重要な概念であり、ユーザーとオペレーティング システム間の対話環境を提供し、ユーザーのプロセス グループを管理します。Linux のセッションの概念を理解し、理解することは、ユーザーの対話動作を正しく管理および制御するために重要です。

2. セッションとターミナルの違い

セッションとターミナルは関連する 2 つの概念ですが、同一ではありません。

セッションとは、ユーザー認証、永続的な接続、状態維持などを含む、ユーザーとオペレーティング システムまたはアプリケーション間の対話プロセスを指します。セッションでは、ユーザーは端末またはその他の対話型手段を介してシステムと通信できます。

ターミナルは、ユーザーとコンピュータの対話を提供するデバイスまたはインターフェイスであり、ユーザーはコマンドを入力し、出力を表示し、ターミナルを通じてシステムと対話することができます。端末は、物理デバイス (物理端末デバイス、コンソールなど) または仮想デバイス (仮想端末、SSH 接続など) の場合があります。端末は、ユーザーとシステム間の入出力チャネルを提供します。

下面是它们之间的区别:

1. 概念レベル:

セッションとは、ユーザー認証、永続的な接続、状態の維持など、ユーザーとオペレーティング システムまたはアプリケーションの間の対話プロセスを指します。
ターミナルは、ユーザーがコンピュータと対話するためのデバイスまたはインターフェイスであり、ユーザーの入力と出力のためのチャネルを提供します。

2. 協会:

多くの場合、セッションと端末は関連しています。ユーザーは、端末デバイスまたは仮想端末を通じてセッションを開始し、セッション内のシステムと対話できます。
端末は、同じ端末デバイス上で開かれる複数の仮想端末セッションなど、複数のセッションを持つことができます。

3.機能:

セッションには、ユーザー認証、状態維持、永続的接続などの機能が含まれており、ユーザーとシステム間の対話を管理するために使用されます。
ターミナルは、ユーザーがコマンドを入力し、出力を表示し、システムと対話するための機能を提供します。

4.物理的特性:

セッションは、ユーザーとシステム間の対話プロセスを表す抽象的な概念であり、特定の物理デバイスは関与しません。
端末は、物理デバイス (キーボード、モニターなど) または仮想デバイス (仮想端末、SSH 接続など) にすることができます。

ここに画像の説明を挿入します

コマンド ライン シェルが新しいコマンドを実行して新しいプロセスを作成すると、次のようになります。

& を使用して新しいプロセスを作成します。新しく作成されたプロセスはバックグラウンド プロセスですが、あなたは依然としてフォアグラウンド プロセスです。

新しいプロセスを作成する場合は & を使用しないでください。新しく作成されたプロセスはフォアグラウンド プロセスであり、それ自体がバックグラウンド プロセスとして設定されます。

3. 端末プロセスグループの識別

Linux では、各ターミナル セッションに一意のプロセス グループ識別子 (PGID) があります。端末プロセスグループ識別子は、ジョブ制御とプロセス管理を実装するために導入されています。
各ターミナル セッションのプロセスはプロセス グループに属します。ユーザーが端末上で新しいプロセスを開始すると、デフォルトでは、そのプロセスは同じ端末セッションのプロセス グループに割り当てられます。

终端进程组标识具有以下特点:

1. セッションリーダーのプロセスグループ識別子:
各セッションには、セッションを作成するセッションリーダー(セッションリーダー)が存在し、セッションリーダーのプロセスグループ識別子はセッションID(セッションID、SID)と同じです。 )。

2. フォアグラウンド プロセス グループ:
ターミナル セッションでは、フォアグラウンド プロセス グループ (フォアグラウンド プロセス グループ) は 1 つだけ存在できます。このフォアグラウンド プロセス グループは通常、端末からユーザー入力を受信し、出力を端末に送信します。ユーザーが端末上で入力したコマンドは、フォアグラウンド プロセス グループのフォアグラウンド プロセスに送信されます。

3. バックグラウンド プロセス グループ:
ターミナル セッションには同時に複数のバックグラウンド プロセス グループを含めることができます。バックグラウンド プロセス グループは、ターミナル セッション内で実行されますが、ユーザー入力を受け入れないプロセス グループです。バックグラウンド プロセス グループは、端末をブロックせずに端末セッションで実行できます。

端末プロセス グループ識別子を使用することにより、システムは、フォアグラウンドまたはバックグラウンドでのプロセス グループの実行、フロント プロセス グループとバック グラウンド プロセス グループの切り替え、シグナルの送信などのジョブ制御を管理できます。
現在の端末プロセス グループ ID を表示するには、echo $$ コマンドを使用できます。このコマンドは、現在のシェル プロセスのプロセス ID (PID) を出力します。シェル プロセスのプロセス グループ ID は、ターミナル プロセス グループ ID です。

4. セッションを作成する

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    
    
    pid_t pid;

    // 创建一个子进程
    pid = fork();
    if (pid < 0) {
    
    
        fprintf(stderr, "无法创建子进程\n");
        return 1;
    } else if (pid == 0) {
    
    
        // 子进程

        // 创建一个新的会话
        if (setsid() < 0) {
    
    
            fprintf(stderr, "无法创建新会话\n");
            return 1;
        }

        // 关闭标准输入、输出和错误输出
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        // 从这里开始,子进程就可以执行会话中的任务

        // 示例:打开一个日志文件并写入日志
        FILE* logFile = fopen("/var/log/mylog.txt", "w");
        if (logFile == NULL) {
    
    
            fprintf(stderr, "无法打开日志文件\n");
            return 1;
        }

        fprintf(logFile, "会话已启动\n");
        fprintf(logFile, "执行一些任务\n");

        // 关闭日志文件
        fclose(logFile);

        // 子进程完成任务后退出
        exit(0);
    } else {
    
    
        // 父进程
        // 这里可以选择等待子进程完成或继续执行其他任务
        printf("子进程的PID:%d\n", pid);
    }

    return 0;
}

このサンプル プログラムは子プロセスを作成します。子プロセスは、setsid() 関数を呼び出して新しいセッションを作成し、標準入力、出力、およびエラー出力を閉じ、セッション内のタスクの実行を開始します (これは単なる例です。特定のニーズに応じて実行できます。改訂)。親プロセスは、子プロセスが完了するまで待つか、他のタスクの実行を継続するかを選択できます。

要約する

この記事ではここで説明します。

Supongo que te gusta

Origin blog.csdn.net/m0_49476241/article/details/133047934
Recomendado
Clasificación