C - Синхронизация ошибок с использованием семафоров - PullRequest
1 голос
/ 25 марта 2019

Вот мой код, где есть ОТЕЦ, который создает 15 процессов с использованием fork (), а затем он запускает таймер. После создания все дети должны взаимодействовать с собой (а не с отцом), пока не остановится таймер. После этого они разблокируют семафор, отец приступает к своим обязанностям, а затем прекращает работу. У меня есть некоторые проблемы с семафорами. Когда у ребенка блокировка, программа ждет вечно.

#define NUM_SEMS 2 //number of semaphores
#define PADRE 0 //father semaphore
#define ALUNNI 1 //child semaphore
#define POP_SIZE 15 //number of child

/*more defines*/
/*shared memory initialization*/

/* Create a shared memory area */
   mem_Id = shmget(IPC_PRIVATE, sizeof(*corso), 0600);
   TEST_ERROR;
   shm_id = mem_Id;
   /* Attach the shared memory to a pointer */
   corso = shmat(mem_Id, NULL, 0);
   TEST_ERROR;

   corso->cur_idx = 0;   /* init first counter */
   shm_print_stats(2, mem_Id);

   /* Create a semaphore to synchronize the start of all child
    * processes */
printf("Creo SEMAFORI\n");

   sem_Id = semget(IPC_PRIVATE, NUM_SEMS, 0600);
   TEST_ERROR;
   /* Sem 0 to syncronize the start of child processes */
   semctl(sem_Id, 0, SETVAL, 0);


//  TEST_ERROR;

#ifdef SHMEMORY
   semctl(sem_Id, 1, SETVAL, 1); //puoi disattivare il semaforo
#endif  

   /* Initialize the common fields */
   sops.sem_num = 0;     /* check the 0-th semaphore */
   sops.sem_flg = 0;     /* no flag */
printf("SUBITO PRIMA DELL'INIT\n");

   init();

   kid_pids = malloc(POP_SIZE*sizeof(*kid_pids));
   for (i=0; i<POP_SIZE; i++) {
       matricola = maxMin_rand(99999, 10000);
       //printf("\nSono qui3\n");
       switch (kid_pids[i] = fork()) {

       case -1:
           /* Handle error */
           TEST_ERROR;
           break;

       case 0:
           /* Wait for the green light */

           sops.sem_op = -1;
           semop(sem_Id, &sops, 1);

           while(exit_loop == 0 || exit_loop == 1){


/*child code*/

               }

               unlockSem(sem_Id, ALUNNI);
               }
               //sleep(1);

           exit(0);
           break;

       default:
           break;
       }
   }

   /* 
    * All child  processes are  attached. Then the  shared memory
    * can be  marked for deletion.
    */

   while (shmctl(mem_Id, IPC_RMID, NULL)) { TEST_ERROR; }

   /* Inform child processes to start */

   sops.sem_op = POP_SIZE;
   semop(sem_Id, &sops, 1);


   /* Waiting for all child processes to terminate */
   while ((child_pid = wait(&status)) != -1) {
       dprintf(2,"PID=%d. Sender (PID=%d) terminated with status 0x%04X\n",
           getpid(),
           child_pid,
           status);

   }

   /* Now the semaphore may be deallocated */
   semctl(sem_Id, 0, IPC_RMID);

Я ожидаю инициализировать разделяемую память, используя процесс отца, и создать 15 детей, потому что отец получил ЗАМК на семафор PADRE. Затем он открывает Семафор, и теперь очередь за ребенком. Они взаимодействуют друг с другом, обновляя общую память. После истечения таймера отец восстанавливает блокировку, он печатает некоторые записи общей памяти и, наконец, завершает работу.

Я, должно быть, неправильно использую семафор, возможно, установил семафор для отца, а другой для детей - слишком много. Если это можно исправить одним семафором, то все в порядке.

...