2016-12-03 5 views
1

я создал код для проекта UNIX с использованием semaphores.My кода заключается в следующем:независимого выполнения процессов с семафорами

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/mman.h> 
#include "display.h" 
#include <semaphore.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 

typedef struct { 
sem_t p1; 
sem_t p2; 
}SemPair ; 

int main (int argc, char *argv[]) { 
SemPair *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_ANONYMOUS , -1, 0); 
int i=0; 
sem_init(&(sem->p1),1,0); 
sem_init(&(sem->p2),1,0); 

pid_t pid = fork(); 
if (!pid) 
{ 
    for(i=0;i<10;i++) { 
     sem_wait(&(sem->p2)); 
     display("Hello world\n"); 
     sem_post(&(sem->p1)); } 
    } 
    else 
    { 
    for(i=0;i<10;i++) { 

     sem_post(&(sem->p2)); 
     sem_wait(&(sem->p1)); 
     display("Goodnight world\n"); 
     sleep(1);} 

} 
sem_destroy(&(sem->p1)); 
sem_destroy(&(sem->p2)); 

return 0; 

}

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

Hello world 
Goodnight world 
Hello world 
Goodnight world 
Hello world 
Goodnight world 
.... 

Вместо этого я хочу, чтобы процессы не выполняются в порядке, поэтому вывод будет что-то вроде этого:

Hello world 
    Hello world 
    Hello world 
    Goodnight world 
    Hello world 
    Goodnight world 
    Goodnight world 
    .... 
+0

Вы должны изучить [правильное форматирование C] (// prohackr112.tk/r/proper-c-formatting). Или узнайте, как [полностью обфускать свой код] (// prohackr112.tk/r/proper-c-obfuscation). –

+0

Посмотрите, что семафор ждет, когда и для чего. –

ответ

0

Это произойдет не так, как вы используете семафоры.

Вся проблема получения выходных данных (и причина использования семафоров для начала) заключается в том, что процесс прерывается в середине его написания.

Без семафоров, у вас есть это:

  1. процесс А начинает печатать "Ад"
  2. процесс А прерывается; другие процессы выполняются
  3. процесс B в конечном итоге получает свое время совместного использования и начинает печать «Хорошо»
  4. процесс B прерывается; другие процессы протекают
  5. процесс А получает дописать: «О мире»

Вы знаете об этом, конечно. Вы можете видеть, как это приводит к искажению результата.

Дело в том, как семафоры меняют это. Когда вы доберетесь до пункта 3, процесс B будет заблокирован из-за его вызова sem_wait (кстати, ваш «процесс B» неправильно обрабатывает семафор). Когда процесс A увеличивает семафор до 1, sem_post будет немедленно разблокировать процесс B и продолжить его до того, как процесс A вернется в начало цикла и снова запустит .

+0

Может быть, я не был достаточно ясен. То, что я хочу сделать с помощью семафоров, - это не печатать, разрешите сказать первый дисплей, а затем второй, а затем первый и т. Д. 10 раз. Я хочу отобразить всю строку Hello world и всю строку goodnight world, но в случайном порядке. Например, один раз первый дисплей, а затем 3 раза второй дисплей, а затем 2 раза первый и т. д. – foris

+0

Нет, вы были достаточно ясны! И я ответил на ваш вопрос. Когда один процесс увеличивает семафор до 1, другой немедленно разблокируется. Таким образом, вы всегда будете получать «Hello world» и «Goodnight world» в последовательности. – giusti

+0

любые идеи, как я могу выполнить то, что хочу с помощью этого кода? Или я должен использовать совершенно новый метод. Thnaks за вашу помощь – foris