У меня есть мастер процессов, который порождает N дочерних процессов , которые взаимодействуют с родителем через неназванные каналы. Я должен быть в состоянии:
- заставляет отца открыть файл и затем отправить каждому ребенку структуру, сообщающую, что он должен прочитать от min до max строки;
- это произойдет одновременно, поэтому я не знаю:
- 1-й, как разделить total_lines для N карт и
- 2-й, как мне заставить каждого ребенка читать только те строки, которые он должен?
Моя проблема не касается О.С. понятия, только файловые операции: S
Возможно, fseek? Я не могу отобразить файл журнала (некоторые имеют более 1 ГБ).
Буду признателен за некоторые идеи. Заранее спасибо
РЕДАКТИРОВАТЬ: я пытаюсь заставить детей читать соответствующие строки без использования fseek и значения кусков, так что, может кто-нибудь сказать мне, если это действительно так? :
//somewhere in the parent process:
FILE* logFile = fopen(filename, "r");
while (fgets(line, 1024, logFile) != NULL) {
num_lines++;
}
rewind(logFile);
int prev = 0;
for (i = 0; i < maps_nr; i++) {
struct send_to_Map request;
request.fp = logFile;
request.lower = lowLimit;
request.upper = highLimit;
if (i == 0)
request.minLine = 0;
else
request.minLine = 1 + prev;
if(i!=maps_nr-1)
request.maxLine = (request.minLine + num_lines / maps_nr) - 1;
else
request.maxLine = (request.minLine + num_lines / maps_nr)+(num_lines%maps_nr);
prev = request.maxLine;
}
//write this structure to respective pipe
//child process:
while(1) {
...
//reads the structure to pipe (and knows which lines to read)
int n=0, counter=0;
while (fgets(line, 1024, logFile) != NULL){
if (n>=minLine and n<=maxLine)
counter+= process(Line);//returns 1 if IP was found, in that line, between the low and high limit
n++;
}
//(...)
}
Я не знаю, сработает ли это, я просто заставляю это работать! Даже так, можно ли превзойти один процесс, считывая весь файл и печатая общее количество ips, найденных в файле журнала?