gpt4 book ai didi

C、TCP 服务器上的 'fork: resource temporarily unavailable'

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:16 24 4
gpt4 key购买 nike

int
run ()
{
char str[100];
int listen_fd, comm_fd;

struct sockaddr_in servaddr;
listen_fd = socket (AF_INET, SOCK_STREAM, 0);

bzero (&servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons (INADDR_ANY);
servaddr.sin_port = htons (8080);
int n;
bind (listen_fd, (struct sockaddr *) &servaddr, sizeof (servaddr));
listen (listen_fd, 10);

int pid;
while (1)
{
comm_fd = accept (listen_fd, (struct sockaddr *) NULL, NULL);
if (comm_fd < 0)
printf ("ERROR on accept");
//fork new process
pid = fork ();
if (pid < 0)
{
printf ("ERROR in new process creation");
}
if (pid == 0)
{
close (listen_fd);
bzero (str, 256);
n = read (comm_fd, str, 255);
if (n < 0)
printf ("ERROR reading from socket");
printf ("Here is the message: %s\n", str);
n = write (comm_fd, "I got your message", 18);
if (n < 0)
printf ("ERROR writing to socket");
close (comm_fd);
}
else
{

close (comm_fd);
}
}

printf ("readIn Exit!");
exit (1);

}

为什么这会造成 fork 炸弹,我怎样才能让它作为可以处理客户端丢失的多客户端服务器工作?

有些帖子建议每个用户的最大进程太低,但我的是 709。对我来说这似乎足以让这篇文章运行(我使用的是 mac book)

我也试过下面的方法,结果一样:

while((comm_fd = accept(listen_fd, (struct sockaddr *) NULL, NULL))){
pid = fork();
if(pid == 0){
close(listen_fd);
while(1){
bzero( str, 100);
read(comm_fd, str, 100);
printf("S: %s", str);
write(comm_fd, str, strlen(str)+1);
sleep(1);
}
exit(1);
} else {
close(listen_fd);
}
}

最佳答案

由于这部​​分,这是一个 fork 炸弹:

while (1) {
pid = fork();
if (pid == 0) { /* child */
...read()...write()...
} else { /* parent */
close(comm_fd);
}
}

这是一个无限循环,父级不断 fork 和关闭 comm_fd。每个 child 在成功读写后,将在下一次迭代中依次 fork 。重复直到所有进程槽都泄漏。

您的第二个代码段用完了所有进程槽,因为父进程需要 wait()wait4() 来收集子进程的退出状态。在完成此操作之前,进程将保持僵尸状态。每个僵尸占用一个进程槽。

就像 malloc 需要相应的释放一样,fork 需要等待。

PS:C 中的规范无限循环写成 for(;;) 以避免 while(1) 中的常数值 bool 值。

关于C、TCP 服务器上的 'fork: resource temporarily unavailable',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140355/

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