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

时间:2009-10-14 20:28:36

标签: c linux unix networking

以下代码片段创建了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);
}

(我知道在接受后分叉允许程序为每个连接创建一个进程。我正在使用原型线程和各种异步内容,所以我只是考虑每个内核有一个进程。)

1 个答案:

答案 0 :(得分:10)

你可以这样做。

如您所知,接受后分叉是每个客户/连接一个孩子。在接受之前分叉(但是在听之后)通常被称为预分叉。每个孩子都在等待接受,并且任何孩子获得传入连接都会处理它。这是安全的,只要接受是由内核完成的(我认为)任何现代的unix都可以。如果没有,你必须在接受周围放置某种IPC(互斥等)。 pre-forking的优点是你不需要为每个连接花费一个fork,你已经有了一个现有的池。