2016-11-26 9 views
1
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include "display.h" 
#include <sys/ipc.h> 
#include <sys/sem.h> 

int main() 
{ 
    int i; 
    struct sembuf up = {0,1,0}; 
    struct sembuf down = {0,-1,0}; 
    int sem0 = semget(IPC_PRIVATE,1,0600); 
    int sem1 = semget(IPC_PRIVATE,1,0600); 
    if (fork()) 
    { 
     for (i=0;i<10;i++) 
      display("ab"); 
      semop(sem1,&up,1); 
      semop(sem0,&down,1); 
      wait(NULL); 
    } 
    else 
    { 
     for (i=0;i<10;i++) 
      semop(sem1,&down,1); 
      display("cd\n"); 
      semop(sem0,&up,1); 
      semop(sem1,&down,1); 
    } 
    semctl(sem0,0,IPC_RMID); 
    semctl(sem1,0,IPC_RMID); 
    return 0; 
} 

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

EDIT: это функция отображения из файла заголовка, если это необходимо.

void display(char *str) 
{ 
    char *p; 
    for (p=str; *p; p++) 
    { 
    write(1, p, 1); 
    usleep(100); 
    } 
} 

ответ

0

В вашем коде есть некоторые проблемы, и, пожалуйста, ознакомьтесь с комментариями в коде описания.

int main() 
{ 
    int i; 
    struct sembuf up = {0,1,0}; 
    struct sembuf down = {0,-1,0}; 
    int sem0 = semget(IPC_PRIVATE,1,0600); 
    int sem1 = semget(IPC_PRIVATE,1,0600); 
    if (fork()) 
    { 
     for (i=0;i<10;i++) 
     { 
      display("ab"); 
      semop(sem1,&up,1); 
      semop(sem0,&down,1); 
      //wait(NULL); //MAYUR: wait() suspends the execution until one of its children terminates. But this was unnecessary here. I removed it. 
     } //MAYUR: There was no brackets for "for loop". Added it in both the blocks. 
    } 
    else 
    { 
     for (i=0;i<10;i++) 
     { 
      semop(sem1,&down,1); 
      display("cd\n"); 
      semop(sem0,&up,1); 
      //semop(sem1,&down,1); //MAYUR: You are doing wait for sem1 in two places. This is was leading to deadlock. Removed it. 
     } 
    } 
    semctl(sem0,0,IPC_RMID); 
    semctl(sem1,0,IPC_RMID); 
    return 0; 
} 

Выход:

abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd