родительский и дочерний процесс выполняются одновременно - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь понять, как работает следующая программа, которую я написал для Raspberry Pi со светодиодной матрицей.

Предполагается, что в программе дочерний процесс, разветвленный основным процессом, загорится светодиод с 0,0 -0,8 на первой итерации для num = 0.Но вместо этого светодиоды случайным образом загораются в 0-м столбце.

Пример: в 0-м столбце 0,6,4,5,2,3,1 в 1-м столбце 0,6,5,4,2,3,1 и так далее до 8-го столбца.

Я не понимаю, почему «основной» цикл управления строками работает случайным образом, но второй цикл управления столбцами работает упорядоченно возрастающим образом.

Чего мне не хватает вработа fork вместе с циклом for?

Из вывода я могу только догадываться, что родитель каким-то образом одновременно создает случайные дочерние процессы, которые вызывают функцию 2 со своим аргументом случайного числа.

<header files>
function1
 {   creates a delay of a second through calculations }
function2(n)
 { for(int i = 0; i<=8 ;i++) 
      function1;
       printf("LED(%d,%d)\n",n,i);
  }
  main()
  {
    for(int num = 0; num <=7; num++)
         {
            pid_t pid = fork(); 
            if (pid ==0)
              {   function2(num); }  
          }
     for (int num =0; num <= 7; num++)
             { wait(NULL);}
     }    

1 Ответ

0 голосов
/ 26 сентября 2018

Отцовские и дочерние процессы выполняются одновременно, и неясно, какой процесс выполняется в какое время.

Из первой проверки у вас есть цикл, который начинается с родительского процесса и создает 8 дочерних процессов,что со своей стороны каждый создает другие дочерние процессы!Вы должны завершить дочерний процесс после вызова функции 2, иначе дочерние процессы создадут другие процессы.

Я думаю, что решение вашей проблемы будет примерно таким:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void function1() {
    //0.5 seconds sleep
    usleep(500000);
}

void function2(int n) {
    for(int i = 0; i <= 8; i++)  {
        function1();
        printf("LED(%d,%d)\n", n, i);
    }
}
int main()
{
    pid_t pid;
    for(int num = 0; num <= 7; num++) {
        pid = fork(); 
        if (pid == 0) {
            function2(num);
            exit(0);
        }
    }
    for (int num = 0; num <= 7; num++){
        wait(NULL);
    }
    return 0;
}

Пожалуйста, на будущеевопросы, пожалуйста, отправьте Минимальный, Полный и Проверяемый пример .

В коде также может быть проблема параллелизма, я не думаю, что printf - это атомарная функция, поэтому семаформожет быть необходимо избежать нескольких процессов, вызывающих printf.

Еще одно замечание: проверка должна быть fork(), чтобы проверить, был ли дочерний процесс успешно сгенерирован.

...