我見過很多類似的問題,但都是針對特定案例,並沒有幫助我找到解決方案。我將不勝感激對我的情況的任何反饋,如下所示:爲什麼我不能寫入或讀取管道?
我想寫一個程序從文本文件中獲取字符數。該程序通過分派四個映射器和26個reducer,併爲每個映射器創建管道。父進程將輸入分爲四行,並將一行傳遞給每個映射器,該映射器計算其行中每個字符的數量。然後,每個映射器將計數傳遞給合適的縮減器,將所有四個計數相加並打印結果。
下面是我的代碼至今:
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;
}
我遇到的問題是,我不能寫減速管道。每當我嘗試寫入,讀取或關閉它們時,都會收到錯誤的地址錯誤。他們是否過期了?我沒有正確創建它們嗎? 如果有人有意見,我將不勝感激。
快速編輯:我刪除了所有的「close」語句,因爲它們有相同的問題。然而,我已經嘗試關閉它們應該關閉的管道,只是爲了找到相同的錯誤信息。
您正在使用大錘來破解堅果 - http://dictionary.cambridge.org/us/dictionary/english/a-sledgehammer-to-crack-a-nut - 爲什麼? –
總是,*總是*檢查錯誤!並閱讀手冊頁,例如[這個'寫'手冊頁](http://man7.org/linux/man-pages/man2/write.2.html)。 –
@EdHeal這是一個演示mapper/reducer範例的類作業。完全沒有必要,但我需要弄明白。 – Haley