Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два процесса симулируют доступ к одному ресурсу?! 
:(
    Опции темы
Killer_13
  Дата 1.2.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Может кто поможет с задачкой, а то нужно, а я уже вижу, что не успею разобраться с этим до завтра...

Написать на "С" программку, которая симулирует доступ двух процессов на один и тот же ресурс.
Запуск с консоли (unix)
Процесс1 пишет 'X', процесс2 'O'.
Защитить критический ресурс консоли с помощью семафора...

Пример вызова..
Код

./mySemaphor 1 &
 Этот процесс должен производить "Х"

./mySemaphor
 Этот процесс должен производить "О"


Спасибо за помощь!
PM MAIL   Вверх
feodorv
Дата 1.2.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



Цитата(Killer_13 @  1.2.2012,  17:51 Найти цитируемый пост)
Запуск с консоли (unix)

А почему в раздел для Windows?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Killer_13
Дата 1.2.2012, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Не знаю, попутал наверное, если что модераторы перенесите тему пож.

Цитата

feodorv
а по теме? smile
PM MAIL   Вверх
Dem_max
Дата 2.2.2012, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: нет
Всего: 39



Shared memory in DLL ????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 2.2.2012, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 2.2.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



Цитата(Killer_13 @  1.2.2012,  17:51 Найти цитируемый пост)
не успею разобраться с этим до завтра...

Разобрались? Или уже не нужно? smile 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Killer_13
Дата 2.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



нет, пока знакомий подкинул такой вариант, если ест минутка глянте:
я не знаю верно ли это.

Код

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>

#define SEMAPHORE_NAME "/my_semaphore"

int main(int argc, char ** argv) {
   sem_t *sem;

   if ( argc == 2 ) {
       printf("off semaphore...\n");
       if ( (sem = sem_open(SEMAPHORE_NAME, 0)) == SEM_FAILED ) {
          /* perror("sem_open");*/
           return 1;
       }
       sem_post(sem);
       /*
       perror("sem_post");
       printf("Semaphore dropped.\n");
       */
       return 0;
   }

   if ( (sem = sem_open(SEMAPHORE_NAME, O_CREAT, 0777, 0)) == SEM_FAILED ) {
    /*   perror("sem_open");*/
       return 1;
   }

   while(1)  {
       printf("X \n");
       sem_wait(sem);
       /* perror("sem_wait");*/
       printf("0 \n");
   }

   sem_close(sem);
   /*
    perror("sem_close");

   */
   return 0;
}

PM MAIL   Вверх
feodorv
Дата 2.2.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



Цитата(Killer_13 @  2.2.2012,  16:41 Найти цитируемый пост)
я не знаю верно ли это

Код за основу взять можно. Мне в нём не нравятся несколько вещей:
  • неравнозначность процессов. То есть случай, когда argc == 2, должен отличаться только печатью
  • X должно выдаваться на печать в одном процессе, O - в другом (я правильно понял?)
  • какой-то странный первый вызов sem_open

Я бы сделал где-то так:
Код

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>

#define SEMAPHORE_NAME "/my_semaphore"

int main(int argc, char ** argv) 
{
  const char *out = (argc == 2) ? "X\n" : "O\n";
  sem_t *sem;

  if( (sem = sem_open(SEMAPHORE_NAME, O_CREAT, 0777, 1)) == SEM_FAILED ) 
  {
    /* perror("sem_open");*/
    return 1;
  }

  while(1)  
  {
    sem_wait(sem);
    printf( out  );
    sem_post(sem);
  }

  sem_close(sem);
   /*
    perror("sem_close");
   */
  /* sem_unlink( SEMAPHORE_NAME ); */
  return 0;
}


Печать будет очень быстрой, возможно, нужно будет вставить задержки.
Так же нужно будет сделать перехват SIGTERM/SIGHUP с корректным выходом из цикла while.
К сожалению, у меня нет под рукой юникса, проверить код не в состоянии...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Killer_13
Дата 2.2.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Цитата

X должно выдаваться на печать в одном процессе, O - в другом (я правильно понял?)

скорее всего да

Цитата

Печать будет очень быстрой, возможно, нужно будет вставить задержки.
Так же нужно будет сделать перехват SIGTERM/SIGHUP с корректным выходом из цикла while.

прислушаюь к любому вашему совету...

Цитата

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

сорри пишу транслитом..
Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.