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 インクルード元

tcpServer_linux.c のインクルード元

1.1.5 著作権

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.1.2 呼び出し元

sigchld_handler の呼び出し元

2.2 shutdown_handler

static void shutdown_handler ( int sig )

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

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

2.2.1 引数

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

2.2.2 呼び出し元

shutdown_handler の呼び出し元

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.3.4 呼び出し元

create_listen_socket の呼び出し元

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.4.2 呼び出し元

worker_loop の呼び出し元

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.5.2 呼び出し元

platform_init の呼び出し元

2.6 platform_cleanup

void platform_cleanup ( void )

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

2.6.1 呼び出し元

platform_cleanup の呼び出し元

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.7.3 呼び出し元

dispatch_internal_args の呼び出し元

2.8 run_fork_server

void run_fork_server ( int port )

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

2.8.1 引数

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

2.8.2 呼び出し元

run_fork_server の呼び出し元

2.8.3 呼び出し先

run_fork_server の呼び出し先

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 以上の場合はイベント駆動型の多重接続処理。

2.9.2 呼び出し元

run_prefork_server の呼び出し元

2.9.3 呼び出し先

run_prefork_server の呼び出し先

3 変数

3.1 running

static volatile sig_atomic_t running = 1;

4 定数、マクロ

4.1 MAX_EPOLL_EVENTS

#define MAX_EPOLL_EVENTS 64

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