2013-07-19 2 views
2

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

Код клиента отображает строку, доступную в общей памяти.

ПОЛНЫЙ Код: available in this github link

Server.c

int main(int argc, char *argv[]) 
{ 
    /* code to create posix shared memory and posix named semaphore */ 

    /* critical section start */ 

    snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]); 

    /* critical section end */ 
} 

Client.c

int main(int argc, char *argv[]) 
{ 
    /* code to open posix shared memory and posix named semaphore */ 

    for(i=0; i<20; i++){ 
     /* critical section start */ 

     //operation of semaphore 
     while(loop < 15){ 
      printf("Type : %d, content : %s\n", shared_msg->type, shared_msg->content); 
      sleep(1); 
      loop++; 
     } 

    /* Critical section end */ 

    loop = 0; 
    printf("loop %d finished\n", i); 
     } 
} 

Как использовать (ждать и пост) POSIX семафор в коде выше, для достижения следующих требований

  • При запуске клиента он должен отображать данные разделяемой памяти. как только внутренний цикл цикла будет завершен, тогда только клиент освободит общую память.
  • Если сервер запускается и пытается записать данные в общую память, когда клиент во время цикла работает, семафор не будет писать, чтобы написать, пока клиент не выпустит семафор.
  • В однолинейном сервере должен писать, когда клиент освободит семафор

Спасибо.

+0

Вы пробовали 'человек sem_overview' на командная строка? –

+0

есть. Тем не менее я получаю некоторую борьбу. – sujin

+0

Какой клиентский сервер связывается через общую память? Почему бы не использовать трубы или розетки? –

ответ

1

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

mysem = sem_open(SEMOBJ_PATH, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG, 2); 

Вы хотите начальное значение равным 1. Первый процесс, который хочет написать общую память называет sem_wait декремент CTR 0, тем самым заставляя любой другой процесс, который вызывает sem_wait подождать, пока значение отлична от нуля. Другими словами, семафор заблокирован до тех пор, пока процесс его удержания не достигнет sem_post.

Ваш псевдокод выглядит в основном правильным. sem_wait, когда вы входите в критический раздел и sem_post при выходе. Я думаю, что ваша проблема, как я понимаю, заключается в неправильной инициализации семафора на sem_open.

0

Из ответа @Duck я переписываю код. теперь я получаю ожидаемый результат.

Я инициализации семафора с 1, как сказал в ответ @Duck

обновленный server.c

int main(int argc, char *argv[]) 
{ 
    /* code to create posix shared memory and posix named semaphore */ 

    /* critical section start */ 
    sem_wait(mysem); //update 
    snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]); 

    /* critical section end */ 
} 

обновленный client.c

int main(int argc, char *argv[]) 
{ 
/* code to open posix shared memory and posix named semaphore */ 

for(i=0; i<20; i++){ 
    /* critical section start */ 

    //operation of semaphore 
    while(loop < 15){ 
     printf("Type : %d, content : %s\n", shared_msg->type, shared_msg->content); 
     sleep(1); 
     loop++; 
    } 
    sem_post(mysem); 
/* Critical section end */ 

    loop = 0; 
    printf("loop %d finished\n", i); 
    } 
} 
Смежные вопросы