在接受连接之前或之后分叉?

以下代码片段创build了4个进程,全部共享相同的侦听套接字。

这样做有没有危险? 我应该一直有一个听取过程和叉后连接被接受,传统的方式?

for (p = 0; p < 3; p++) { pid = fork(); if (pid == 0) break; } while (1) { unsigned int clientlen = sizeof(echoclient); /* Wait for client connection */ if ((clientsock = accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) { die("Failed to accept client connection"); } fprintf(stdout, "Process No. %d - Client connected: %s\n", p, inet_ntoa(echoclient.sin_addr)); handle_client(clientsock); } 

(我明白,接受后分叉允许一个程序每个连接都创build一个进程,我正在玩原线程和各种asynchronous的东西,所以我只是在看每个核心有一个进程。)

Solutions Collecting From Web of "在接受连接之前或之后分叉?"

你可以做到这一点。

正如你所注意到的,接受之后的分叉是每个客户端/连接的一个孩子。 在接受之前分叉(但是在听之后)通常被称为预分叉。 每个孩子等待接受和任何孩子得到传入的连接过程。 这是安全的,只要接受是由内核(我认为)任何现代的Unix所做的。 如果不是的话,你必须在接受处添加一些IPC(互斥体等)锁。 预分叉的好处是你不需要为每个连接花费一个分支,你已经有一个现有的池。