{"id":4155,"date":"2014-05-09T09:26:15","date_gmt":"2014-05-09T00:26:15","guid":{"rendered":"http:\/\/www.vincentina.net\/?p=4155"},"modified":"2022-01-28T12:29:14","modified_gmt":"2022-01-28T03:29:14","slug":"%e3%81%93%e3%81%aa%e3%81%84%e3%81%a0%e4%bd%9c%e3%81%a3%e3%81%9f%e7%b0%a1%e6%98%93web%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%82%92%e3%83%9e%e3%83%ab%e3%83%81%e3%82%bf%e3%82%b9%e3%82%af%e5%8c%96-3","status":"publish","type":"post","link":"https:\/\/www.vincentina.net\/?p=4155","title":{"rendered":"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff083\uff09"},"content":{"rendered":"<p>\u30b7\u30ea\u30fc\u30ba3\u4f5c\u76ee\u308c\u3059\u3002<br \/>\n\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30d7\u30ed\u30bb\u30b9\u3092\u4f5c\u6210<br \/>\n\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30b9\u30ec\u30c3\u30c9\u3092\u4f5c\u6210<br \/>\n\u3068\u3044\u3046\u5185\u5bb9\u306b\u7d9a\u3044\u3066<\/p>\n<p>\u5236\u9650\u4ed8\u304d\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u3002<\/p>\n<p>\u3084\u3063\u3066\u307f\u305f\u3089\u65b0\u3057\u3044\u3053\u3068\u3092\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3066\u3001\u8d77\u52d5\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u306e\u6570\u3092\u5236\u9650\u3059\u308b\u3068\u3044\u3046\u3082\u306e\u3067\u3057\u305f\u3002\u30b5\u30fc\u30d0\u30fc\u3092\u3055\u308f\u3063\u3066\u308b\u3068\u30d7\u30ed\u30bb\u30b9\u6570\u306e\u5236\u9650\u3068\u304b\u306f\u5272\u3068\u3088\u304f\u3084\u308b\u3053\u3068\u306a\u306e\u3067\u3001\u306a\u3093\u3060\u3068\u601d\u3063\u3066\u3057\u307e\u3046\u304b\u3082\u3057\u308c\u306b\u3083\u3002<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u3082\u672c\u66f8\u306eEcho\u30b5\u30fc\u30d0\u30fc\u3068\u307e\u3063\u305f\u304f\u540c\u3058\u3082\u306e\u3067\u52d5\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>\u3066\u306a\u611f\u3058\u3067\u7d42\u308f\u308a\uff01\uff01\u3067\u306f\u3064\u307e\u3089\u306a\u3044\u306e\u3067\u3001\u3061\u3087\u3063\u3068\u3060\u3051\u5185\u5bb9\u3092\u5909\u3048\u3066\u307f\u3066\u8d77\u52d5\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u6570\u3092\u5236\u9650\u3057\u3066\u30011\u500b\u306e\u30d7\u30ed\u30bb\u30b9\u3067\u30b9\u30ec\u30c3\u30c9\u3092\u7acb\u3061\u4e0a\u3052\u308b\u578b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3057\u3088\u3046\u3068\u601d\u3044\u307e\u3059\u3002\u3068\u8a00\u3063\u3066\u3082\u307b\u3068\u3093\u3069\u4e00\u7dd2\u306a\u3093\u3060\u304c\u306d\u3002<\/p>\n<p>\u304a\u3001\u305d\u308c\u3063\u3066Apache\uff1f\u3068\u601d\u3063\u305f\u65b9\u306f<b>\u65e9\u5408\u70b9<\/b>\u3067\u3059\u3002<span style=\"font-size: 14pt;\">\u6ce8\uff1a\u305f\u3051\u3051\u3093\u3082\u542b\u3080<\/span><\/p>\n<p>\u672c\u66f8\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306f<br \/>\n\u30d7\u30ed\u30bb\u30b9\u3000\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\u30d7\u30ed\u30bb\u30b9\u3000\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u3061\u3087\u3063\u3068\u66f8\u304d\u63db\u3048\u305f\u3082\u306e\u306f<br \/>\n\u89aa\u30d7\u30ed\u30bb\u30b9\uff08exit(0))<br \/>\n\u5b50\u30d7\u30ed\u30bb\u30b9\u3000\uff08Daemon\u5316\uff09<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\u5b50\u30d7\u30ed\u30bb\u30b9\u3000\uff08Daemon\u5316\uff09<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\u3067\u3059\u3002<\/p>\n<p>Apache\uff08Woker\uff09\u306f<br \/>\n\u89aa\u30d7\u30ed\u30bb\u30b9\uff08Daemon\uff09<br \/>\n\uff1d\uff1e\u5b50\u30d7\u30ed\u30bb\u30b9<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\uff1d\uff1e\u5b50\u30d7\u30ed\u30bb\u30b9<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\uff1d\uff1e\u30b9\u30ec\u30c3\u30c9\uff1d\uff1e\u30bd\u30b1\u30c3\u30c8<br \/>\n\u3067\u3001\u3055\u3089\u306b\u30b9\u30ec\u30c3\u30c9\u306e\u6570\u3082\u5236\u9650\u3057\u305f\u308a\u3067\u304d\u305f\u306f\u305a\u3060\u306d\u3002<\/p>\n<p>Web\u30b5\u30fc\u30d0\u3068\u3044\u3063\u3066\u3082GET\u3057\u304b\u3067\u304d\u306a\u3044\u3057\u3001CGI\u3082\u4f7f\u3048\u306a\u3044\u306a\u3044\u3057\u3001\u3069\u3093\u306a\u8106\u5f31\u6027\u304c\u3042\u308b\u304b\u3082\u308f\u304b\u308a\u307e\u305b\u3093\u3057\u3001\u3060\u308c\u3082\u3084\u3089\u306a\u3044\u3068\u306f\u601d\u3044\u307e\u3059\u3051\u3069\u7d76\u5bfe\u306b<span style=\"font-size: 14pt;\">\u516c\u958b\u30b5\u30fc\u30d0\u30fc<\/span>\u3068\u3057\u3066\u306f\u4f7f\u308f\u306a\u3044\u3067\u306d\u3002<\/p>\n<p><span style=\"font-size: 14pt;\">\u3053\u3093\u306a\u8106\u5f31\u6027\u304c\u3042\u3063\u305f<\/span>\u7684\u306a\u8a71\u306f\u30a6\u30a7\u30eb\u30ab\u30e0\u3067\u3059\u3002<\/p>\n<p>\u3042\u3068\u3001\u65e5\u8a18\u306b\u8f09\u305b\u308b\u3068\u3053\u308d\u3092\u5c0f\u3055\u304f\u3057\u305f\u304b\u3063\u305f\u306e\u3067\u5ba3\u8a00\u3042\u305f\u308a\u306f\u5168\u90e8\u30d8\u30c3\u30c0\u30fc\u306b\u3057\u307e\u3057\u305f\u3002<br \/>\n\u8a73\u3057\u304f\u306f<a title=\"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff08\uff12\uff09\" href=\"http:\/\/www.vincentina.net\/?p=4145\" target=\"_blank\" rel=\"noopener\">\u524d\u56de\u306e\u65e5\u8a18\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/a><\/p>\n<p>\u305d\u30fc\u3059\u3000\u00a0TCPWebServer_type_ForkThread.c<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;TCPWebServer_type_Thread_2.h&quot;\r\n\r\nvoid ThreadMainroutin(int servSock);\r\nvoid *ThreadMain(void *arg);\r\nint AcceptTCPConnection(int servSock);\r\nint CreateTCPServerSocket(unsigned short port);\r\n\r\nvoid GetHtml( FILE *sock_fp, HEAD_DATA *data )\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FILE *fp;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char *buf;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct stat st;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(stat(data-&amp;gt;path + 1, &amp;amp;st) &amp;lt; 0){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;404error\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if((buf = (char *)calloc(st.st_size, sizeof(char))) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;calloc\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, &quot;%s 200 OK\\r\\n&quot;, data-&amp;gt;version);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, &quot;Server:sample\\r\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, &quot;Content-Type:text\/html\\r\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, &quot;Content-Length:%d\\r\\n&quot;, (int)st.st_size);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, &quot;\\r\\n&quot;);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((fp = fopen(data-&amp;gt;path + 1, &quot;r&quot;)) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;fopen\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 fread(buf, 1, st.st_size, fp);\r\n\u00a0\u00a0\u00a0 fwrite(buf, 1, st.st_size, sock_fp);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(buf);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fclose(fp);\r\n\r\n}\r\n\r\nvoid HandleTCPClient(int clntSocket)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FILE *sock_fp;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char *data&#x5B;64], buf&#x5B;2048];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HEAD_DATA headData;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((sock_fp = fdopen(clntSocket, &quot;r+&quot;)) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;fdpoen\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned int len;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned int i, k;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &amp;lt; 64; i++){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fgets(buf, sizeof(buf), sock_fp),\u00a0 (void)CutCrLf(buf);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((len = strlen(buf)) == 0) break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((data&#x5B;i] = (char *)calloc(len + 1, sizeof(char))) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;calloc\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 strcpy(data&#x5B;i], buf);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 k = i;\r\n\r\n#ifdef DEBUG\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(&quot;%s\\n&quot;, data&#x5B;0]);\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len =\u00a0 CutChar( data&#x5B;0]\u00a0\u00a0\u00a0\u00a0\u00a0 , headData.method,\u00a0\u00a0\u00a0\u00a0 ' '\u00a0 ), len++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len += CutChar( data&#x5B;0] + len, headData.path,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' '\u00a0 ), len++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len += CutChar( data&#x5B;0] + len, headData.version,\u00a0\u00a0\u00a0 '&#92;&#48;' ), len++;\r\n\r\n#ifdef DEBUG\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(&quot;%s %s %s\\n&quot;, headData.method, headData.path, headData.version);\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(strstr(&quot;headData.version&quot; , &quot;1.0&quot;) != NULL || strstr(&quot;headData.version&quot; , &quot;1.1&quot;) != NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;request error\\n&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GetHtml(sock_fp, &amp;amp;headData);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fflush(sock_fp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i=0; i &amp;lt; k; i++){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(&quot;%s&quot;, data&#x5B;i]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(data&#x5B;i]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nint main(int argc, char *argv&#x5B;])\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int servSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30b5\u30fc\u30d0\u306e\u30bd\u30b1\u30c3\u30c8\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned short echoServPort;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30b5\u30fc\u30d0\u30dd\u30fc\u30c8\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int i;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pid_t processID = 0;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(argc != 2)\u00a0\u00a0 \/\/\u5f15\u6570\u306e\u6570\u3092\u30c1\u30a7\u30c3\u30af\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;Usage: %s &amp;lt;Server Port&amp;gt;\\n&quot;, argv&#x5B;0]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echoServPort = atoi(argv&#x5B;1]);\u00a0\u00a0 \/\/\u30ed\u30fc\u30ab\u30eb\u30dd\u30fc\u30c8\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 servSock = CreateTCPServerSocket(echoServPort);\r\n             \/* \u7c21\u6613\u5f62\u5f0f\u30d7\u30ed\u30bb\u30b9\u306f5\u500b\u307e\u3067 *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &amp;lt; 5; i++){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((processID = fork()) == 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ThreadMainroutin(servSock);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if(processID &amp;lt; 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(&quot;fork() failed&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n    exit(0);\r\n}\r\n\r\nvoid ThreadMainroutin(servSock)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int clntSock;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct ThreadArgs *threadArgs;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pthread_t threadID;\r\n\r\n\u00a0\u00a0\u00a0 while(1) \/\/\u7e70\u308a\u8fd4\u3057\u5b9f\u884c\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clntSock = AcceptTCPConnection(servSock);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs))) == NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(&quot;malloc() failed&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 threadArgs-&amp;gt;clntSock = clntSock;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;1:pid = %d\\n&quot;, gettid());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Create client thread *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (pthread_create(&amp;amp;threadID, NULL, ThreadMain, (void *) threadArgs) != 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(&quot;pthread_create() failed&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pthread_join(threadID, NULL);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 close(clntSock);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(&quot;with thread %ld\\n&quot;, (long int) threadID);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n}\r\n\r\n\r\nvoid *ThreadMain(void *threadArgs)\r\n{\r\n\r\n\u00a0\u00a0\u00a0 int clntSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Socket descriptor for client connection *\/\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, &quot;2:tid=%d\\n&quot;, gettid());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clntSock = ((struct ThreadArgs *) threadArgs) -&amp;gt; clntSock;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(threadArgs);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HandleTCPClient(clntSock);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(NULL);\r\n}\r\n<\/pre>\n<p>\u3053\u308c\u3067\u3042\u3068\u306f\u591a\u91cd\u5316\u3068\u3044\u3046\u9805\u76ee\u3092\u6b8b\u3059\u3060\u3051\u306b\u306a\u308a\u307e\u3057\u305f\u3002<br \/>\n6\u7ae0\u30017\u7ae0\u3082\u7d42\u308f\u3063\u3066\u308b\u3093\u3060\u3051\u3069\u30016\u7ae0\u306b\u3064\u3044\u3066\u306f\u3082\u3046\u3044\u3044\u3088\u3063\u3066\u8a00\u308f\u308c\u308b\u304f\u3089\u3044\u8aad\u307f\u8fd4\u3057\u3066\u304a\u3044\u305f\u65b9\u304c\u3044\u3044\u5185\u5bb9\u306a\u6c17\u304c\u3059\u308b\u3002<\/p>\n<p>\u3064\u30fc\u304b\u3001\u3060\u3093\u3060\u3093\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u9577\u304f\u306a\u3063\u3066\u304f\u308b\u306e\u3067\u3001\u30d8\u30c3\u30c0\u30d5\u30a1\u30a4\u30eb\u306e\u66f8\u304d\u65b9\u3068\u304b\u30d5\u30a1\u30a4\u30eb\u3092\u5206\u3051\u308b\u30dd\u30ea\u30b7\u30fc\u3068\u304b\u3001\u3082\u30461\u56de\u57fa\u672c\u3092\u5fa9\u7fd2\u3057\u305f\u65b9\u304c\u3044\u3044\u3063\u3057\u3087\u3002<\/p>\n<p>\u306a\u3093\u304b\u5206\u304b\u3089\u3093\u3051\u3069\u52d5\u3044\u305f\u3002\u3068\u306a\u308b\u306e\u304c\u5acc\u3067C\u3092\u3084\u3063\u3066\u308b\u306e\u306b\u5148\u304c\u6016\u3044\u3058\u3087 ((((;\u00b4\uff65\u03c9\uff65`)))<\/p>\n<p>\u304a\u3063\u3068\u3001\u5b9f\u884c\u7d50\u679c\u3092\u5fd8\u308c\u3066\u305f\u3002<\/p>\n<p>\u30d7\u30ed\u30bb\u30b9\u306f5\u500b\u7acb\u3061\u4e0a\u304c\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u308b\u306e\u30675\u500b\u8d77\u52d5\u3057\u307e\u3059\u3002<br \/>\n\u89aa\u30d7\u30ed\u30bb\u30b9\u306f\u7d42\u4e86\u3057\u3066\u5b50\u30d7\u30ed\u30bb\u30b9\u304cinit\u306e\u5b50\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n\u3044\u304f\u3089\uff1dAccept\u304c5\u500b\u3067\u3059\u306d\u3002\u3042\u3068\u306f\u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u8fd4\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n&#x5B;root@testserver_centos ~]# .\/TCPWebServer_type_ForkThread 8000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n&#x5B;root@testserver_centos ~]# \u3046\u306b\r\n\u3044\u304f\u3089\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\r\n&#x5B;root@testserver_centos ~]#&lt;\/pre&gt;\r\n\u30d7\u30ed\u30bb\u30b9\u306f\u3053\u3093\u306a\u611f\u3058\u3002PPID\uff1d\uff11\u30675\u500b\u52d5\u3044\u3066\u307e\u3059\u3002\r\n&lt;pre&gt;&#x5B;root@testserver_centos ~]# ps -ef | grep TC&#x5B;P]\r\nroot\u00a0\u00a0\u00a0\u00a0\u00a0 6033\u00a0\u00a0\u00a0\u00a0 1\u00a0 0 04:13 pts\/5\u00a0\u00a0\u00a0 00:00:00 .\/TCPWebServer_type_ForkThread 8000\r\nroot\u00a0\u00a0\u00a0\u00a0\u00a0 6034\u00a0\u00a0\u00a0\u00a0 1\u00a0 0 04:13 pts\/5\u00a0\u00a0\u00a0 00:00:00 .\/TCPWebServer_type_ForkThread 8000\r\nroot\u00a0\u00a0\u00a0\u00a0\u00a0 6035\u00a0\u00a0\u00a0\u00a0 1\u00a0 0 04:13 pts\/5\u00a0\u00a0\u00a0 00:00:00 .\/TCPWebServer_type_ForkThread 8000\r\nroot\u00a0\u00a0\u00a0\u00a0\u00a0 6036\u00a0\u00a0\u00a0\u00a0 1\u00a0 0 04:13 pts\/5\u00a0\u00a0\u00a0 00:00:00 .\/TCPWebServer_type_ForkThread 8000\r\nroot\u00a0\u00a0\u00a0\u00a0\u00a0 6037\u00a0\u00a0\u00a0\u00a0 1\u00a0 0 04:13 pts\/5\u00a0\u00a0\u00a0 00:00:00 .\/TCPWebServer_type_ForkThread 8000&lt;\/pre&gt;\r\n\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001\u4e0a\u306b\u3042\u308bPID\u306e\u3044\u305a\u308c\u304b\u304b\u3089\u30b9\u30ec\u30c3\u30c9\u304c\u4f5c\u6210\u3055\u308c\u3066\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u51e6\u7406\u3092\u3057\u307e\u3059\u3002\r\n&lt;pre&gt;&#x5B;root@testserver_centos ~]#\r\n\r\nHandling client 192.168.24.53\r\n1:pid = 6036\r\n2:tid=12551\r\nwith thread 139848045307648\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\n\r\nHandling client 192.168.24.53\r\n1:pid = 6037\r\n2:tid=12552\r\nwith thread 139848045307648\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\n\r\nHandling client 192.168.24.53\r\n1:pid = 6035\r\n2:tid=12553\r\nwith thread 139848045307648\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n<\/pre>\n<p>\u3046\u306b\u3001\u3044\u304f\u3089\u3063\u3066\u4f55\u3060\u3088(\u7b11)\u3063\u3066\u4eba\u306f\u3059\u3044\u307e\u305b\u3093\u304c<a title=\"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff08\uff12\uff09\" href=\"http:\/\/www.vincentina.net\/?p=4145\" target=\"_blank\" rel=\"noopener\">\u524d\u65e5\u306e\u65e5\u8a18\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/a><\/p>\n<p>&nbsp;<\/p>\n<div class='wp_social_bookmarking_light'>        <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.vincentina.net\/?p=4155\" data-text=\"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff083\uff09\" data-via=\"TakekenTw\" data-lang=\"ja\">Tweet<\/a><\/div><\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u30b7\u30ea\u30fc\u30ba3\u4f5c\u76ee\u308c\u3059\u3002 \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30d7\u30ed\u30bb\u30b9\u3092\u4f5c\u6210 \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30b9\u30ec\u30c3\u30c9\u3092\u4f5c\u6210 \u3068\u3044\u3046\u5185\u5bb9\u306b\u7d9a\u3044\u3066 \u5236\u9650\u4ed8\u304d\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u3002 \u3084\u3063\u3066\u307f\u305f\u3089\u65b0\u3057\u3044\u3053\u3068\u3092\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3066\u3001\u8d77\u52d5\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u306e\u6570\u3092\u5236\u9650\u3059\u308b\u3068\u3044\u3046\u3082\u306e\u3067\u3057\u305f\u3002 &hellip; <a href=\"https:\/\/www.vincentina.net\/?p=4155\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff083\uff09&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106],"tags":[],"class_list":["post-4155","post","type-post","status-publish","format-standard","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4155"}],"version-history":[{"count":2,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4155\/revisions"}],"predecessor-version":[{"id":7855,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4155\/revisions\/7855"}],"wp:attachment":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}