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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> процессы, юникс лаба МГГУ 
:(
    Опции темы
polly
  Дата 1.6.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

"Процесс 1 порождает потомков 2 и 3, все они присоединяют к себе две области разделяемой памяти M1 и M2 объемом (N1*sizeof(int)) и (N2*sizeof(int)) соответственно. Процесс 1 пишет в M1 число, которое после каждой записи увеличивается на 1; процесс 2 переписывает k2 чисел из M1 в M2, а процесс 3 переписывает k3 чисел из M2 в файл. После каждого этапа работы процесс 1 засыпает на t1 секунд, процесс 2 - на t2 секунд, а процесс 3 - на t3 секунд. Процессу 1 запрещается записывать в занятую область M1; процесс 2 может переписать данные, если была произведена запись в M1 и M2 свободна; процесс 3 может переписывать данные из M2, только если была осуществлена запись в M2. Используя семафоры, обеспечить синхронизацию работы процессов в соответствии с заданными условиями. Параметры N1, N2, k1, k2, k3, t1, t2, t3 задаются в виде аргументов командной строки."

Во такие задачки... Может, поможет кто бедной студентке советом али делом как с этой прогой разобраться?
СПС.
PM MAIL   Вверх
MAKCim
Дата 1.6.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(polly @  1.6.2007,  16:44 Найти цитируемый пост)
Во такие задачки... Может, поможет кто бедной студентке советом али делом как с этой прогой разобраться?

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

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

#define PROCESSES_COUNT     2
#define NUMBERS_COUNT       20
#define __1FILE_NAME        "process1"
#define __2FILE_NAME        "process2"

static int states[PROCESSES_COUNT];
static int count;

struct {
    pid_t pid;
    const char *name;
} files[PROCESSES_COUNT] = {
{0, __1FILE_NAME},
    {0, __2FILE_NAME}
};

static void child_handler(int signal) {}

static int do_child(const char *name) {
    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &child_handler;
    sigaction(SIGUSR2, &action, NULL); /* устанавливаем обработчик сигнала, которым родительский процесс извещает дочерние о том, что можно начинать читать файлы */
pid_t pid = getppid();
    kill(pid, SIGUSR1); /* посылаем родительскому процессу сигнал о готовности прочитать файл */
    pause(); /* ждем подтверждения */
    int file = open(name, O_RDONLY); /* открываем файл */
    if (file < 0)
        return errno;
    int number;
/* начало синхронизации */
    while (read(file, &number, sizeof(int)) > 0) /* читаем его */
       printf("%d\n", number); /* и выводим содержимое на экран */
/* конец синхронизации */
    close(file);
    return 0;
}

static void parent_handler(int signal) {
    ++count; /* увеличиваем на 1 счетчик готовности дочерних процессов */
}

static int do_create_file(int index) {
    int file = open(files[index].name, O_CREAT | O_WRONLY | O_TRUNC, 0666); /* создаем файл */
    if (file < 0)
        return errno;
int number = index;
    for (index = 0; index < NUMBERS_COUNT; ++index)
        write(file, &number, sizeof(int)); /* и пишем в него 20 раз число (0 и 1 - зависит от index) */
    close(file);
    return 0;
}

static int do_parent() {
    int index;
    while (count < PROCESSES_COUNT) /* ждем, пока все дочерние процессы не просигнализируют о готовности читать файлы */
        sleep(1);
    for (index = 0; index < PROCESSES_COUNT; ++index) {
do_create_file(index); /* создаем файл */
        kill(files[index].pid, SIGUSR2); /* и посылаем сигнал очередному дочернему процессу, чтобы он мог начать чтение */
    }
    while (1) { /* ждем завершения дочерних процессов */
        if (waitpid(-1, NULL, WNOHANG))
            --count;
        if (!count) break;
    }
    return 0;
}

int main() {
    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &parent_handler;
    sigaction(SIGUSR1, &action, NULL); /* устанавливаем обработчик сигнала SIGUSR1, который посылается дочерними процессами родительскому, когда они готовы читать файлы */
    int error = 0, index;
    for (index = 0; index < PROCESSES_COUNT; ++index) {
        if ((files[index].pid = fork()) == 0) /* создаем процессы */
            _exit(do_child(files[index].name)); /* и запускаем соответствующие функции, которые будут выполняться в процессах */
        else if (files[index].pid < 0) {
error = errno;
            while (index--) kill(files[index].pid, SIGKILL);
            goto exit;
        }
    }
    error = do_parent(); /* запускаем функцию родительского процесса */
    unlink(__1FILE_NAME);
    unlink(__2FILE_NAME);
exit:
    return error;
}




Это сообщение отредактировал(а) MAKCim - 2.6.2007, 20:06


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nerezus
  Дата 1.6.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



MAKCim, зря код дал, код только навредит - она не будет разбираться в деле, которым будет профессионально заниматься(ты же не думаешь, что такое изучают экономисты/юристы/АТФ и т.д.?)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MAKCim
Дата 1.6.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
HappyCoder
Дата 1.6.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



polly, будем надеяться, что ты наверстаешь упущеный материал. Всё-таки, такие "листочки" лучше понимать на начальном этапе, чем потом разгрёбывать кучи "мусора".
PM MAIL   Вверх
polly
  Дата 2.6.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, 
MAKCim, 
MAKCim, 
MAKCim, спасибо огромное вообщето я специалистка будущая по автоматике и управлению. ничего не понимаю в програмировании. ты меня очень выручил. а как насчет последней задачки?
если бы я знала что такое синхронизация вывода я бы тебе ответила...
Код
[color=blue][/color]



Добавлено через 3 минуты и 6 секунд
MAKCim,  прости за такую наглость с моей стороны, но ты не мог бы мне объяснить принцип действия и то что выдаст прога при ее проверке. заранее спасибо
PM MAIL   Вверх
MAKCim
Дата 2.6.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(polly @  2.6.2007,  19:42 Найти цитируемый пост)
а как насчет последней задачки?

уточни условие
Цитата(polly @  1.6.2007,  16:44 Найти цитируемый пост)
Процесс 1 пишет в M1 число, которое после каждой записи увеличивается на 1; 

что за число?
Цитата(polly @  1.6.2007,  16:44 Найти цитируемый пост)
Параметры N1, N2, k1, k2, k3, t1, t2, t3 задаются в виде аргументов командной строки."

где в условии задачи фигурирует k1?
и еще, какое условие завершения программы? или она вечно должна работать?

Добавлено @ 19:55
Цитата(polly @  2.6.2007,  19:42 Найти цитируемый пост)
прости за такую наглость с моей стороны, но ты не мог бы мне объяснить принцип действия и то что выдаст прога при ее проверке. заранее спасибо 

то, что в условии требуется  smile 
Цитата(polly @  1.6.2007,  16:44 Найти цитируемый пост)
Процессы 2 и 3 считывают данные из файлов и выводят их на экран

данные - 20 нулей (2-ой процесс) и 20 единиц (3-ий процесс)
могут чередоваться, т. к нет синхронизации

ps. смотри комментарии в коде


Это сообщение отредактировал(а) MAKCim - 2.6.2007, 20:07


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
polly
Дата 2.6.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, как посмотреть коментарии в коде?
блин, я не умею даже пользоваться форумом smile ты мне написал прогу для какой задачки для первой? насчет "какое число?" - любое. 
PM MAIL   Вверх
MAKCim
Дата 2.6.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(polly @  2.6.2007,  20:14 Найти цитируемый пост)
как посмотреть коментарии в коде?

мой пост с кодом  smile 
Цитата(polly @  2.6.2007,  20:14 Найти цитируемый пост)
ты мне написал прогу для какой задачки для первой?

 smile  smile 
Цитата(polly @  2.6.2007,  20:14 Найти цитируемый пост)
насчет "какое число?" - любое.  

а остальное?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
polly
Дата 2.6.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, все. поняла спасибо.
насчет второй задачки, я не знаю я просто скопировала тебе условие 
помоги пожалуйста мне ОЧеНЬ нужно

Добавлено через 1 минуту и 40 секунд

MAKCim, могу лишь повторить условие задачки:"1.    Процесс 1 порождает потомков 2 и 3, все они присоединяют к себе две области разделяемой памяти M1 и M2 объемом (N1*sizeof(int)) и (N2*sizeof(int)) соответственно. Процесс 1 пишет в M1 число, которое после каждой записи увеличивается на 1; процесс 2 переписывает k2 чисел из M1 в M2, а процесс 3 переписывает k3 чисел из M2 в файл. После каждого этапа работы процесс 1 засыпает на t1 секунд, процесс 2 - на t2 секунд, а процесс 3 - на t3 секунд. Процессу 1 запрещается записывать в занятую область M1; процесс 2 может переписать данные, если была произведена запись в M1 и M2 свободна; процесс 3 может переписывать данные из M2, только если была осуществлена запись в M2. Используя семафоры, обеспечить синхронизацию работы процессов в соответствии с заданными условиями. Параметры N1, N2, k1, k2, k3, t1, t2, t3 задаются в виде аргументов командной строки."  
PM MAIL   Вверх
MAKCim
Дата 2.6.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



polly, 
условие неполное
я конечно могу додумать за аффтаров сей замечательной задачи, пойдет?
да, тебе сдавать то когда надо?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
polly
Дата 2.6.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



HappyCoder, спасибо, конечно. но это даже не моя специальность. мне это необходимо просто для зачета.по жизне мне это не надо. нужна лишь помощь а в центр помощи я не умею заходить. так что если сможешь мне помочь, то я буду очень рада.  smile :"1.    Процесс 1 порождает потомков 2 и 3, все они присоединяют к себе две области разделяемой памяти M1 и M2 объемом (N1*sizeof(int)) и (N2*sizeof(int)) соответственно. Процесс 1 пишет в M1 число, которое после каждой записи увеличивается на 1; процесс 2 переписывает k2 чисел из M1 в M2, а процесс 3 переписывает k3 чисел из M2 в файл. После каждого этапа работы процесс 1 засыпает на t1 секунд, процесс 2 - на t2 секунд, а процесс 3 - на t3 секунд. Процессу 1 запрещается записывать в занятую область M1; процесс 2 может переписать данные, если была произведена запись в M1 и M2 свободна; процесс 3 может переписывать данные из M2, только если была осуществлена запись в M2. Используя семафоры, обеспечить синхронизацию работы процессов в соответствии с заданными условиями. Параметры N1, N2, k1, k2, k3, t1, t2, t3 задаются в виде аргументов командной строки."

Добавлено через 2 минуты и 8 секунд
MAKCim, в понедельник могу предложить другую задачку:"
4.    Процесс 1 порождает потомка 2, они присоединяют к себе разделяемую память объемом (N*sizeof(int)). Процесс 1 пишет в нее k1 чисел сразу, процесс 2 переписывает k2 чисел из памяти в файл. Процесс 1 может производить запись, только если в памяти достаточно места, а процесс 2 переписывать, только если имеется не меньше, чем k2 чисел. После каждой записи (чтения) процессы засыпают на t секунд. После каждой записи процесс 1 увеличивает значение записываемых чисел на 1. Используя семафоры, обеспечить синхронизацию работы процессов в соответствии с заданными условиями. Параметры N, k1, k2, t задаются в виде аргументов командной строки."

Добавлено через 10 минут и 10 секунд
MAKCim, в понедельник могу предложить другую задачку:"
4.    Процесс 1 порождает потомка 2, они присоединяют к себе разделяемую память объемом (N*sizeof(int)). Процесс 1 пишет в нее k1 чисел сразу, процесс 2 переписывает k2 чисел из памяти в файл. Процесс 1 может производить запись, только если в памяти достаточно места, а процесс 2 переписывать, только если имеется не меньше, чем k2 чисел. После каждой записи (чтения) процессы засыпают на t секунд. После каждой записи процесс 1 увеличивает значение записываемых чисел на 1. Используя семафоры, обеспечить синхронизацию работы процессов в соответствии с заданными условиями. Параметры N, k1, k2, t задаются в виде аргументов командной строки."
PM MAIL   Вверх
polly
Дата 3.6.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, как жаль что ты ofline мне завтра с утра сдавать. мне так нужна помошь!!!! smile  smile  smile 
PM MAIL   Вверх
polly
Дата 3.6.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, ааааааааа выручай



PM MAIL   Вверх
MAKCim
Дата 4.6.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



polly, 
см. личное сообщение


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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

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

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


 




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


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

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