Я пытаюсь решить эту проблему, но не могу.
Вот краткое описание:
У нас есть родитель с двумя дочерними процессами (child_a, child_b) и N строками.
Текущие данные: данные [i] (0 ... N)
- Родитель запускается и ждет сигнала от child_b. Child_a ждет.
- Child_b отправляет сигнал родителю и ожидает данные.
- Родитель записывает данные [i] в канал и ожидает
- Child_b читает данные [i] из pipe и printf (). Тогда ждем Child_a
- Child_a генерирует случайное число (от 1 до 5) и записывает в трубу.
- Child_b читает rand из pipe и отправляет его родителю.
- Родитель записывает «data [i] - rand» в файл.
- И начнем с начала со следующих данных ...
Вот мой код:
FILE *fp2;
fp2 = fopen("bill.dat" , "a");
pid_t child_a, child_b;
int pipefd_a[2], pipefd_b[2];
char msg[100];
char sleep_time[10];
int stat;
signal(SIGUSR1, handler);
signal(SIGUSR2, handler);
if(pipe(pipefd_a) == -1 || pipe(pipefd_b) == -1){
perror("Error\n");
exit(EXIT_FAILURE);
}
int i;
for(i = 0; i < n; i++){
child_a = fork();
if(child_a < 0){
perror("Error\n");
}
if(child_a == 0){
sleep(1);
printf("Child_a-----\n");
srand(time(NULL));
int r = rand()%5+1;
char rand[2];
sprintf(rand, "%d", r);
printf("Child_a rand: %s\n", rand);
write(pipefd_b[1], rand, strlen(rand)+1);
printf("Child_a end-----\n");
exit(0);
}
else{
child_b = fork();
if(child_b == 0){
printf("Child_b sends a signal to parent\n");
kill(getppid(), SIGUSR1);
close(pipefd_a[1]);
read(pipefd_a[0], msg, sizeof(msg));
close(pipefd_a[0]);
printf("Child_b reads from pipe (from parent): %s\n", msg);
kill(child_a, SIGUSR2);
sleep(2);
read(pipefd_b[0], sleep_time, 10);
printf("Child_b reads from pipe (from child_a): %s\n", sleep_time);
fflush(NULL);
write(pipefd_b[1], sleep_time, sizeof(sleep_time));
close(pipefd_b[1]);
printf("Child_b end-----\n");
exit(0);
}
printf("============== %d ============== \n", i);
printf("Parent waiting for signal...\n");
pause();
printf("Signal received\n");
printf("Parent write into pipe\n");
close(pipefd_a[0]);
write(pipefd_a[1], data[i].address, 100);
kill(child_b, SIGUSR2);
waitpid(child_b, &stat, 0);
read(pipefd_b[0], msg, sizeof(msg));
fprintf(fp2, "%s - %s\n", data[i].address, msg);
printf("Parent writes into file: %s\n", msg);
}
}
fclose(fp2);
и мой вывод (n = 2):
- data1 - 1
- data1 - 1
- data1 - 1
- data2 - 3
В файле всегда есть 2 ^ n строк.
Для этого требуется два дочерних процесса, и я подозреваю, что проблема связана с «fork ()» внутри цикла, но я не понимаю, что я делаю неправильно.