クライアントごとに新しいプロセスを生成するのはコストが高い
OSはプロセス作成の度にメモリ、スタック、ファイルなどを状態をコピーしなければならないため
#include "TCPEchoServer.h" #include <pthread.h> /* posixスレッドに必要 */ void *ThreadMain(void *arg); struct ThreadArgs { int clntSock; }; int main(int argc, char *argv[]){ int servSock; int clntSock; unsigned short echoServPort; pthread_t threadID; struct ThreadArgs *threadArgs; /* スレッドの引数構造体 */ if(argc != 2) { fprintf(stderr, "Usage: %s <SERVER PORT>\n", argv[0]); exit(1); } echoServPort = atoi(argv); servSock = CreateTCPServerSocket(echoServPort); for(;;){ clntSock = AcceptTCPConnection(servSock); /* クライアント引数用にメモリを確保 */ if((threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs)))==NULL) DieWithError("malloc() failed") threadArgs -> clntSock = clntSock; /* クライアントスレッド生成 */ if(pthread_create(&threadID, NULL, ThreadMain, (void *) threadArgs) != 0) DieWithError("pthread_create() failed"); printf("with thread %ld\n", (long int) threadID); } } void *TheadMain(void *threadArgs) { int clntSock; pthread_detach(pthread_self()); clntSock = ((struct ThreadArgs *) threadArgs) -> clntSock; free(threadArgs); HandleTCPClient(clntSock); return (NULL); }