Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Флаговая переменная


Автор: Xonxt 9.1.2008, 20:04
Доброе время суток.

интересует такой тривиальный вопрос. Увы, гугл ответить не может.

Есть 2 отдельных приложения. Грубо говоря, клиент и сервер.

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

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

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


Автор: JackYF 9.1.2008, 20:30
А почему не заюзать fifo и стандартное read в клиенте и write в сервере?

Автор: Xonxt 9.1.2008, 20:35
Потому что это лабораторная работа smile

Задание так выглядит:

1.    Первое приложение читает слово из текстового файла,  помещая его в участок разделяемой памяти.
2.    Второе приложение  из участка разделяемой памяти выводит слово на экран.
3.    Синхронизировать доступ к участку разделяемой памяти  при помощи флаговой переменной.

Автор: bsa 9.1.2008, 21:45
Xonxt, ну тогда заведи в той же самой разделяемой памяти атомарную переменную. значение 0 означает можно читать файл и писать в эту область, значение 1 значит, что файл прочитан и область заполнена. Итого, если 0 второй процесс ждет, первый читает и переводит в 1, после этого первый ждет, второй работает и переводит в 0...

Автор: Xonxt 9.1.2008, 21:50
В этом-то и проблема. 
Мне с помощью флаговой переменной нужно блокировать доступ клиента к разделяемой памяти, а не размещать этот флаг внутри той же разделяемой памяти..

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

Автор: Xonxt 9.1.2008, 22:12
Ну, допустим, проблема решена.

Но еще одна проблема возникла..

Можно ли попросить, дорогие форумчане,  простейший пример с двумя приложениями, использующими разделяемую память, и с семафорами? А то не могу вьехать....  smile 

Автор: rei3er 10.1.2008, 01:06
Цитата(Xonxt @  9.1.2008,  22:12 Найти цитируемый пост)
Можно ли попросить, дорогие форумчане,  простейший пример с двумя приложениями, использующими разделяемую память, и с семафорами? А то не могу вьехать.... 

Код

static struct sembuf down = {0, -1, 0};
static struct sembuf up = {0, 1, 0};

static void client(int sem_id, void * shared_area) {
    struct sembuf wait = {0, 0, 0};
    semop(sem_id, &wait, 1);
    /* работа с разделяемой памятью */
    semop(sem_id, &up, 1);
}

static void server(int sem_id, void * shared_area) {
    /* значение семафора должно быть 1 */
    struct sembuf wait = {0, 0, IPC_NOWAIT};
    while (1) {
        /* работа с разделяемой памятью */
        semop(sem_id, &down, 1);
        while (!semop(sem_id, &wait, 1));
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)