2015-03-09 4 views
-1

Привет, ребята, что я недавно начал, и я не очень хорошо использую семафоры. То, что я пытаюсь сделать, состоит в том, чтобы один процесс отображал число (например, 1), а другой дисплей процесса 2, а затем переключился обратно на первый дисплей процесса 3, а затем вернулся ко второму индикатору процесса 4 и так далее .... На данный момент я смог отобразить 1, затем 2, затем 3, но, к сожалению, он возвращается к 1 вместо отображения 4. Как я могу отобразить 4. Пожалуйста, помогите :)Семафоры, защищенные оболочкой C

//critical.c 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <stdio.h> 
#include <stdlib.h> 

#include "se_sems.h" 

int main(int argc, char argv[]) 
{ 
    const int ONE_DONE = 0; 
    const int TWO_DONE = 1; 
    volatile int flag = ONE_DONE; 


    //Use our source file as the "key" 
    int id = se_semget("critical.c",1); 

    int pid = fork(); 
    if (pid) { 
     //P1 
     while(1) { 
      flag = ONE_DONE; 

      se_wait(id); 
      printf("2222222222 \n"); 
      printf("22222222222 \n"); 
      fflush(stdout); 
      se_signal(id); 

      flag = TWO_DONE; 
      do { 
       sleep(1); 
      } while (flag == ONE_DONE); 
      printf("444444444444 \n"); 
      printf("44444444444 \n"); 

      se_signal(id); 
     } 
    } else { 
     //P2 
     while (1) { 
      flag = TWO_DONE; 
      se_wait(id); 
      printf("1111111 \n"); 
      printf("1111111 \n"); 
      fflush(stdout); 
      se_signal(id); 

      flag = ONE_DONE; 
      do { 
       sleep(1); 
      } while (flag == TWO_DONE); 
      printf("33333333 \n"); 
      printf("3333333333 \n"); 
      se_signal(id); 
     } 
    } 
} 

выход

1111111 
1111111 
2222222222 
22222222222 
33333333 
3333333333 
1111111 
1111111 
444444444444 
44444444444 
2222222222 
22222222222 
33333333 
3333333333 
1111111 
1111111 
444444444444 
44444444444 

и так далее :)

+0

Это ** C++ ** или ** C **? Поскольку первый комментарий в опубликованном вами файле предполагает, что это ** C **. Также исправление отступов поможет людям помочь вам. – Galik

+0

Вы используете 'флаг' как метод связи после вилки? – Leeor

+0

О да, спасибо, что это C не C++ – Jacob1300x

ответ

0

Я обнаружил, что самый простой способ сделать это, чтобы оставить последний дисплей пустой поэтому он будет выглядеть, как если бы он отображает его по порядку. Так что вам не нужно 2 семафора.

Смежные вопросы