私は、N個の子(マップ)+ 1(縮小)を生成する親を持つ古典的なマップ縮小プログラムを実装しています。親は、名前のないパイプを介して、N 個の子のそれぞれに情報を送信します。マップはリクエストを処理し、結果の int を reduce に送信します。reduce は select を実行し、map から reduce へのパイプに書き込まれたすべてのカウンターを合計します。
最後に、reduce は結果とともにシグナル SIGUSR1 を送信する必要がありますが、シグナル ハンドラで常に o を出力するため、コードは何度も間違って送信します。コードの一部です:
void reduce() {
int answer;
int i = 0;
fd_set set;
FD_ZERO(&set); //clean set of pipes
while (1) {
for (i = 0; i < maps_nr; i++) {
FD_SET(fd_maps_to_reduce[i][READ], &set);
}
if (select(FD_SETSIZE, &set, NULL, NULL, NULL) > 0) {
printf("Entrou no select\n");
for (i = 0; i < maps_nr; i++) {
if (FD_ISSET(fd_maps_to_reduce[i][READ], &set)) {
close(fd_maps_to_reduce[i][WRITE]);
if (read(fd_maps_to_reduce[i][READ], &answer, sizeof (int))) {
result += answer;
printf("Result in reduce =%d\n", result);
} else {
printf("Reduce failed to read from pipe from son :%d!\n", i);
}
}
}
}//end of select
printf("Reduce is going to send a signal with result= %d!\n", result);
kill(getppid(), SIGUSR1);
printf("Already send!\n");
}
}
親では、パイプと子を作成した後、次のようなものがあります。
(...)
signal(SIGUSR1, handle_signal);
while(exit) {
(...)//this is a menu
for i->N
send a struct to each child (through write in respective pipe)
after the for do:
pause();//waiting for a signal to be caught
if (errno==EINTR)
printf("caught sigusr1");
}
void handle_signal(int signum) {
signal(SIGUSR1, handle_signal);
//print results
printf("Result: %d\n",result);
}
問題は、削減プロセスが正しく合計され、正しく出力されることですが、シグナルが何度も送信されているため、1 つだけが必要です。グローバル変数の結果。
どうやってやるの?reduce に何か問題がありますね。