gpt4 book ai didi

c - 在接受连接之前或之后 fork ?

转载 作者:IT王子 更新时间:2023-10-29 00:12:39 25 4
gpt4 key购买 nike

下面的代码片段创建了 4 个进程,它们都共享同一个监听套接字。

这样做有什么危险吗?在连接被接受后,我是否应该始终以传统方式进行一个监听进程和 fork ?

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);
}

(我知道接受后的 fork 允许程序为每个连接创建一个进程。我正在玩原型(prototype)线程和各种异步的东西,所以我只是在考虑每个核心有一个进程。)

最佳答案

两种方式都可以。

正如您所注意到的,接受之后的 fork 是每个客户端/连接的一个 child 。在接受之前(但在监听之后) fork 通常称为预 fork 。每个 child 都在等待接受,任何获得传入连接的 child 都会处理它。只要接受是由内核完成的,这是安全的(我认为)任何现代 unix 都会这样做。如果不是,则必须在接受周围放置某种 IPC(互斥锁等)锁。预 fork 的优点是您不需要为每个连接进行 fork ,因为您已经有了一个现有的池。

关于c - 在接受连接之前或之后 fork ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1568786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com