Я видел много подобных вопросов, но все они касались конкретных случаев и не помогли мне найти решение. Я был бы признателен за любые отзывы о моей ситуации, которые выглядят следующим образом:Почему я не могу писать или читать из труб?
Я пытаюсь написать программу для получения символов из текстового файла. Программа работает путем разметки четырех карт и 26 редукторов и создания труб для каждого из них. Родительский процесс разделяет входные данные на четыре строки и передает один к каждому картографу, который подсчитывает количество каждого символа в его строке. Затем каждый преобразователь передает отсчеты на соответствующие редукторы, которые суммируют все четыре счета и печатают результат.
Ниже мой код до сих пор:
int main(int argc, char *argv[])
{
int i = 0;
FILE *input = fopen("input.txt", "r");
// Things for reading line-by-line: see getline reference on man7.org
char *line = NULL;
size_t len = 0;
// Where we'll store the messages
static char message[MSGSIZE];
for(i = 0; i < NUMREDUCERS; i++)
{
pipe(reducer_pipes[i]);
}
for(i = 0; i < NUMMAPS; i++)
{
// Step 1: Create pipes for communication using the system call pipe()
pipe(mapper_pipes[i]);
// Step 2: Fork a number of mappers (4).
if (fork() == 0)
{
// Don't want to close the write pipe yet
// Child process: one of the mappers
read(mapper_pipes[i][0], message, MSGSIZE); // Read from reading end
char *msg = "Error reading from pipe";
check_errors(msg);
// Get char count and write to pipe
int j = 0;
int ccount = 0;
for(j = 0; j < NUMREDUCERS; j++)
{
// Count up the number of chars
ccount = count_char(message, (char) (j + 97), MSGSIZE);
// Write to the appropriate reducer pipe
write(reducer_pipes[j][1], (char *) ccount, MSGSIZE);
msg = "error writing to reducer pipe";
check_errors(msg);
}
exit(EXIT_SUCCESS);
}
else
{
getline(&line, &len, input);
// Parent process
write(mapper_pipes[i][1], line, (int) len);
char *msg = "Error writing to pipe";
check_errors(msg);
}
}
return 0;
}
Проблема я встречая, что я не могу написать к редуктору труб. Я получаю ошибку плохого адреса, когда я пытаюсь писать, читать или закрывать их. Они как-то истекли? Я не создал их правильно? Если у кого-нибудь есть предложения, я был бы очень признателен.
Быстрое редактирование: я удалил все мои «близкие» утверждения, поскольку у них была такая же проблема. Тем не менее, я пытался закрыть трубы, где они должны быть закрыты, только чтобы найти то же сообщение об ошибке.
Вы используете кувалду, чтобы взломать орех - http://dictionary.cambridge.org/us/dictionary/english/a-sledgehammer-to-crack-a-nut - Почему? –
Всегда, * всегда * проверяйте наличие ошибок! И читайте страницы руководства, например [эту страницу руководства 'write'] (http://man7.org/linux/man-pages/man2/write.2.html). –
@EdHeal Это назначение класса для демонстрации парадигмы mapper/редуктора. Совершенно ненужно, но мне нужно понять это. – Haley