我之前發佈了一條關於using fork() and pipes in C 的問題。我稍微改變了一下設計,以便它讀取一個普通的txt文件並對文件中的單詞進行排序。到目前爲止,這是我想出了:C中的多進程,叉和管道
for (i = 0; i < numberOfProcesses; ++i) {
// Create the pipe
if (pipe(fd[i]) < 0) {
perror("pipe error");
exit(1);
}
// fork the child
pids[i] = fork();
if (pids[i] < 0) {
perror("fork error");
} else if (pids[i] > 0) {
// Close reading end in parent
close(fd[i][0]);
} else {
// Close writing end in the child
close(fd[i][1]);
int k = 0;
char word[30];
// Read the word from the pipe
read(fd[i][0], word, sizeof(word));
printf("[%s]", word); <---- **This is for debugging purpose**
// TODO: Sort the lists
}
}
// Open the file, and feed the words to the processes
file_to_read = fopen(fileName, "rd");
char read_word[30];
child = 0;
while(!feof(file_to_read)){
// Read each word and send it to the child
fscanf(file_to_read," %s",read_word);
write(fd[child][1], read_word, strlen(read_word));
++child;
if(child >= numberOfProcesses){
child = 0;
}
}
其中numberOfProcesses
是一個命令行參數。所以它所做的是讀取文件中的每個單詞並將其發送給進程。但是,這不起作用。當我在子進程中打印該單詞時,它不會給我正確的輸出。我正在向管道正確寫入/讀取單詞嗎?
我強烈懷疑這是主要問題 - 您絕對需要同步您的併發進程,否則輸出將相互「交錯」(即「混亂」)。 – paulsm4
這是一個任務。我對C編程和在Linux環境下工作都很陌生。所以是的,我必須用流程來做到這一點。用C#寫這個不到2個小時。但請注意,我使用Emacs作爲編輯器,而不是Visual Studio,因此整個調試過程是一場噩夢。 – PoweredByOrange
@ programmer93如果您習慣於IDE,那麼您最好使用Eclipse和CDT。 –