# porter/src/tech-sample/tcpServer/tcpServer_linux.c

# 1 ファイル

## 1.1 porter/src/tech-sample/tcpServer/tcpServer_linux.c

TCP サーバーサンプル Linux 実装。

Linux 固有のサーバー処理を実装します。

- fork() を使った接続ごとプロセス生成 (run_fork_server)
- fork() を使ったプリフォーク (run_prefork_server)
- プラットフォームフック (platform_init / platform_cleanup / dispatch_internal_args)

main() / handle_client_session() / parse_args() は tcpServer.c に実装します。 g_session_fn の実体は tcpServer_common.c に定義されます。

### 1.1.1 作者

c-modernization-kit sample team

### 1.1.2 バージョン

1.0.0

### 1.1.3 日付

2026/03/17

### 1.1.4 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

# 2 関数

## 2.1 sigchld_handler

    static void sigchld_handler ( int sig )

SIGCHLD シグナルハンドラ。

waitpid() でゾンビプロセスを回収します。

### 2.1.1 引数

- sig [in] シグナル番号 (未使用)。

## 2.2 shutdown_handler

    static void shutdown_handler ( int sig )

SIGINT / SIGTERM シグナルハンドラ。

running フラグを 0 にセットして prefork のメインループを終了させます。

### 2.2.1 引数

- sig [in] シグナル番号 (未使用)。

## 2.3 create_listen_socket

    static int create_listen_socket ( int port )

listen ソケットを作成してバインドし、待ち受けを開始します。

### 2.3.1 引数

- port [in] 待ち受けポート番号。

### 2.3.2 戻り値

listen ソケットのファイルディスクリプタ。

### 2.3.3 注意

失敗した場合は exit() で終了します。

## 2.4 worker_loop

    static void worker_loop ( int server_fd, int worker_id, int conns_per_worker )

ワーカープロセスのメインループ (prefork モード用)。

conns_per_worker == 1 の場合: accept() → g_session_fn() を繰り返す従来の逐次処理。

conns_per_worker > 1 の場合: epoll を使ったイベントループで最大 conns_per_worker 本のコネクションを シングルスレッドで同時処理します。容量に達すると server_fd を epoll から 除去して新規 accept を止め、空きが生じると再登録して受け付けを再開します。

### 2.4.1 引数

- server_fd [in] サーバーソケットのファイルディスクリプタ。
- worker_id [in] ワーカーの識別番号。
- conns_per_worker [in] 同時接続数。1 の場合は逐次処理、2 以上は epoll 多重処理。

## 2.5 platform_init

    void platform_init ( ClientSessionFn session_fn )

プラットフォーム初期化 (Windows: WSAStartup / Linux: no-op)。

### 2.5.1 引数

- session_fn [in] セッション処理関数。g_session_fn に保存されます。

## 2.6 platform_cleanup

    void platform_cleanup ( void )

プラットフォーム後処理 (Windows: WSACleanup / Linux: no-op)。

## 2.7 dispatch_internal_args

    int dispatch_internal_args ( int argc, char *argv[] )

内部起動引数を処理します。

Windows では `--child <handle>` / `--worker <pipe>` を検出して処理します。 Linux では常に 0 を返します。

### 2.7.1 引数

- argc [in] コマンドライン引数の数。
- argv [in] コマンドライン引数の配列。

### 2.7.2 戻り値

内部起動引数を処理した場合は 1、通常起動の場合は 0 を返します。

## 2.8 run_fork_server

    void run_fork_server ( int port )

fork モードのサーバーを起動します。

### 2.8.1 引数

- port [in] 待ち受けポート番号。

## 2.9 run_prefork_server

    void run_prefork_server ( int port, int num_workers, int conns_per_worker )

prefork モードのサーバーを起動します。

### 2.9.1 引数

- port [in] 待ち受けポート番号。
- num_workers [in] 事前生成するワーカープロセス数。
- conns_per_worker [in] 1 ワーカーあたりの同時接続数。 1 の場合は従来の逐次処理。 2 以上の場合はイベント駆動型の多重接続処理。

# 3 変数

## 3.1 running

    static volatile sig_atomic_t running = 1;

# 4 定数、マクロ

## 4.1 MAX_EPOLL_EVENTS

    #define MAX_EPOLL_EVENTS 64

epoll_wait で一度に取得する最大イベント数。