Я пытаюсь создать программу, которая проверяет список серверов Steam, используя fork. Я видел, что если я ставлю 100 000 серверов строк, программа часто идет по проводной линии l oop и проверяет одни и те же серверы снова и снова. После отладки я вижу, что даже простая программа, которая печатает IP-адрес сервера, работает неожиданно.
Программа:
#include <iostream>
#include <sys/wait.h>
#include <stdio.h>
#include <cstring>
#include <unistd.h>
#include <string>
#include <ctype.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <regex>
#include <vector>
int main(int argc, char **argv)
{
puts("Beginning program");
int max_forks = 500;
int num_forks = 0;
FILE *fpxxx = fopen("servers", "r");
if(fpxxx == NULL) {
perror("Unable to open file!");
exit(0);
}
char chunk[128];
while(fgets(chunk, sizeof(chunk), fpxxx) != NULL)
{
// puts(chunk); // same result if put the line here
if(!(fork()))
{
// sleep(3);
puts(chunk);
exit(0);
}
else
{
num_forks++;
if (num_forks >= max_forks)
{
wait(NULL);
num_forks--;
}
}
}
fclose(fpxxx);
sleep(10);
}
Вывод:
Beginning forking
94.xxx.xxx.209
Beginning forking
184.xxx.xxx.117
Beginning forking
108.xxx.xxx.86
Beginning forking
178.xxx.xxx.140
Beginning forking
113.xxx.xxx.132
Beginning forking
45.xxx.xxx.16
... (many lines, thus servers.txt has 100.000+ ips)
# after a while i see
Beginning forking
178.xxx.xxx.140
# again and again and again
# sometimes i even see
Beginning forking
37.247.104.933.17.199.143
Ожидаемый результат:
94.xxx.xxx.209
184.xxx.xxx.117
108.xxx.xxx.86
178.xxx.xxx.140
113.xxx.xxx.132
45.xxx.xxx.16
Я что-то забыл? Похоже, куча повреждена. И почему я вижу Beginning forking
, как будто программа снова запускается с самого начала? Я знаю, что разветвление делает другой процесс, но я думаю, что fork()
разветвляет программу с того места, где находится fork()
.
Спасибо.
РЕДАКТИРОВАТЬ : getline () постоянно читает файл, когда используется fork ()