Linux での fork 機能の使用方法

PHPz
リリース: 2024-02-23 10:18:04
オリジナル
537 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート