ホームページ システムチュートリアル Linux Linux での fork 機能の使用方法

Linux での fork 機能の使用方法

Feb 23, 2024 am 10:18 AM
linux 使用法 Linux オペレーティング システム フォーク関数

Linux での fork 関数の使用法

Linux オペレーティング システムでは、fork() 関数は非常に重要なシステム コール関数であり、新しいプロセスを作成するために使用されます。 Unix および Unix 系オペレーティング システムで広く使用されています。この記事では、fork 関数の使い方を詳しく紹介し、具体的なコード例をいくつか示します。

1. fork 関数の概要

fork 関数のプロトタイプは次のとおりです:

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
ログイン後にコピー

fork 関数は、次のプロセスのコピーである新しいプロセスを作成します。 forkを呼び出すプロセス。 fork を呼び出した後、2 つの同一のプロセス、つまり親プロセスと子プロセスが生成されます。 2 つのプロセスはメモリ内で独立しており、独立したアドレス空間を持っています。

親プロセスは fork を呼び出し、子プロセスの PID (プロセス ID) を示す非負の数値を返します。子プロセスは fork を呼び出し、0 を返します。フォーク呼び出しが失敗した場合は、子プロセスの作成が失敗したことを示す -1 が返されます。

2. fork 関数の使用法

fork 関数の一般的な使用法は次のとおりです:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    pid_t pid;

    pid = fork();

    if (pid < 0) {
        // fork调用失败
        perror("fork");
        return 1;
    } else if (pid == 0) {
        // 子进程
        printf("Hello from child process! PID=%d
", getpid());
    } else {
        // 父进程
        printf("Hello from parent process! PID=%d, Child PID=%d
", getpid(), pid);
    }

    return 0;
}
ログイン後にコピー

上の例では、fork 関数を通じて新しい子プロセスを作成しました。 。子プロセスでは、「子プロセスからこんにちは!」と現在のプロセスの PID を出力します。親プロセスでは、「親プロセスからこんにちは!」と現在のプロセスの PID と子プロセスの PID を出力します。

上記のコードを実行すると、次の出力が得られます:

Hello from parent process! PID=1234, Child PID=1235
Hello from child process! PID=1235
ログイン後にコピー

fork 関数が正常に呼び出されると、親プロセスと子プロセスがプログラムの後続のコードも同時に実行します。

3. fork 関数の戻り値

上記の例では、fork 関数の戻り値を使用して、現在のプロセスが親プロセスであるか子プロセスであるかを判断します。

  • 戻り値が負の数 (-1) の場合、フォーク呼び出しが失敗したことを意味します。
  • 戻り値が 0 の場合は、現在のプロセスが子プロセスであることを意味します。
  • 戻り値が 0 より大きい場合、現在のプロセスが親プロセスであり、戻り値が子プロセスの PID であることを意味します。

4. fork 関数の実践的な応用

fork 関数は、複数プロセスの同時実行サーバーやプロセス プールなど、実際の開発において多くの応用シナリオがあります。以下は、fork 関数を使用して単純な同時サーバーを実装する方法を示す簡単な例です。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define PORT 8888
#define MAX_BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    pid_t child_pid;

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 设置address
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // 绑定socket和address
    bind(server_fd, (struct sockaddr *)&address, sizeof(address));

    // 监听socket
    listen(server_fd, 5);

    while (1) {
        // 接受客户端连接
        new_socket = accept(server_fd, NULL, NULL);

        // 创建子进程来处理客户端请求
        child_pid = fork();

        if (child_pid < 0) {
            // fork调用失败
            perror("fork");
            return 1;
        } else if (child_pid == 0) {
            // 子进程
            char buffer[MAX_BUFFER_SIZE] = {0};
            read(new_socket, buffer, MAX_BUFFER_SIZE);
            printf("Received message: %s
", buffer);
            close(new_socket);
            return 0;
        } else {
            // 父进程
            // 关闭父进程不需要的socket
            close(new_socket);
        }
    }

    return 0;
}
ログイン後にコピー

上の例では、fork 関数を使用してマルチプロセス同時サーバーを実装しています。クライアントが接続すると、クライアントのリクエストを処理するための子プロセスが作成されます。親プロセスは引き続き他のクライアントからの接続を待機します。このようにして、複数のクライアント接続リクエストを同時に処理し、サーバーの同時パフォーマンスを向上させることができます。

概要:

この記事では、Linux での fork 関数の使用法を紹介し、いくつかの具体的なコード例を示しました。 fork 関数は、Linux オペレーティング システムの非常に重要なシステム コール関数であり、新しいプロセスを作成し、プロセスの同時実行を可能にします。 fork 関数を合理的に使用することで、複雑な同時アプリケーションを実装し、システムのパフォーマンスを向上させることができます。

以上がLinux での fork 機能の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Linuxアーキテクチャ:5つの基本コンポーネントを発表します Linuxアーキテクチャ:5つの基本コンポーネントを発表します Apr 20, 2025 am 12:04 AM

Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

GITの倉庫アドレスを確認する方法 GITの倉庫アドレスを確認する方法 Apr 17, 2025 pm 01:54 PM

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。

VSCODE前の次のショートカットキー VSCODE前の次のショートカットキー Apr 15, 2025 pm 10:51 PM

VSコードワンステップ/次のステップショートカットキー使用法:ワンステップ(後方):Windows/Linux:Ctrl←; macOS:CMD←次のステップ(フォワード):Windows/Linux:Ctrl→; macOS:CMD→

Apr 16, 2025 pm 07:39 PM

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

コードを書いた後に崇高に実行する方法 コードを書いた後に崇高に実行する方法 Apr 16, 2025 am 08:51 AM

Sublimeでコードを実行するには6つの方法があります。ホットキー、メニュー、ビルドシステム、コマンドライン、デフォルトビルドシステムの設定、カスタムビルドコマンド、プロジェクト/ファイルを右クリックして個々のファイル/プロジェクトを実行します。ビルドシステムの可用性は、崇高なテキストのインストールに依存します。

Linuxの主な目的は何ですか? Linuxの主な目的は何ですか? Apr 16, 2025 am 12:19 AM

Linuxの主な用途には、1。Serverオペレーティングシステム、2。EmbeddedSystem、3。Desktopオペレーティングシステム、4。開発およびテスト環境。 Linuxはこれらの分野で優れており、安定性、セキュリティ、効率的な開発ツールを提供します。

Laravelインストールコード Laravelインストールコード Apr 18, 2025 pm 12:30 PM

Laravelをインストールするには、これらの手順を順番に進みます。コンポーザー(MacOS/LinuxとWindows用)インストールLaravelインストーラーをインストールします。

GITソフトウェアのインストール GITソフトウェアのインストール Apr 17, 2025 am 11:57 AM

GITソフトウェアのインストールには、次の手順が含まれています。インストールパッケージをダウンロードしてインストールパッケージを実行して、インストール構成gitインストールgitバッシュ(Windowsのみ)を確認します

See all articles