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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение схемы порождения процессов через fork() 
:(
    Опции темы
nitrexin
Дата 24.10.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Совсем пришел в тупик при выполнении лабы. Суть задания - программа порождает три процесса, каждый из которых записывает в общий файл число, равное своему номеру. Манипулируя схемой порождения процессов и используя сигналы, обеспечить следующее содержимое файла: 1 2 1 3 1 3 3.
Сейчас при выполнении порождаются процессы в следующем порядке и я не могу понять почему:
child2, pid = 9575
child 1 write to file, pid = 9574
child3, pid = 9576


Код

// Программа порождает три процесса, каждый из которых записывает в общий файл число, равное своему номеру. Манипулируя схемой порождения процессов и используя сигналы, обеспечить следующее содержимое файла: 1 2 1 3 1 3 3


#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
int fd, pid1, pid2, pid3;


void process1_write(int signum)
{
    int c = '1', i;
    signal(SIGUSR1, process1_write);
    lseek(fd, 1, SEEK_CUR);    
    write(fd, &c, 1);
    printf ("child 1 write to file, pid = %d\n", getpid());
    exit(0);    
}

//потомок 2 пишет файл
void process2_write(int signum)
{
    int c = '2',i;
    signal(SIGUSR1, process2_write);
    lseek(fd, 1, SEEK_CUR);    
    write(fd, &c, 1);
    printf ("child 2 write to file, pid = %d\n", getpid());
    exit(0);
}

//потомок 3 пишет в файл
void process3_write(int signum)
{
    int c = '3', i;
    signal(SIGUSR1, process3_write);
    lseek(fd, 1, SEEK_CUR);        
    write(fd, &c, 1);
    printf ("child 3 write to file, pid = %d\n", getpid());
    exit(0);    
}

int main(int argc, char *argv[])
{
    int i;
    char cbuf;
    
    /*if (argc != 2)
    {
        printf("error format!\nusage:\n    %s file.txt\n", argv[0]);
        exit(-1);
    }*/
    
    pid1 = getpid();
    fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
    lseek(fd,SEEK_SET,0);  // пишем с начала файза

    signal(SIGUSR1, process1_write);
    
    pid2 = fork();
    if (pid2 == 0)
    {
        //процесс 2
        printf ("child2, pid = %d\n", getpid());
        
        signal(SIGUSR1, process2_write);
        for(;;);
    }else
    {
        pid3 = fork();
        if (pid3 == 0)
        {
            //процесс 3
            printf ("child3, pid = %d\n", getpid());
            signal(SIGUSR1, process3_write);
            for(;;);
        }else
        {
            //процесс 1
            
                //посылаем потомку 2 сигнал SIGUSR1(писать в файл)            
                kill(pid1, SIGUSR1);
                //посылаем потомку 3 сигнал SIGUSR1(писать в файл)
                kill(pid3, SIGUSR1);
                kill(pid1, SIGUSR1);
                kill(pid1, SIGUSR1);
                kill(pid3, SIGUSR1);
                kill(pid1, SIGUSR1);
                kill(pid3, SIGUSR1);
                kill(pid3, SIGUSR1);
            }
            
            
        }
    }


Это сообщение отредактировал(а) nitrexin - 24.10.2011, 17:24
PM MAIL WWW Jabber   Вверх
xvr
Дата 25.10.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Во первых - поставьте в тело for(;;) ; какой нибудь sllep(1000), иначе у вас обработчики сигналов вызываться не будут
Во вторых - уберите exit(0) из обработчиков - иначе более одного раза вы '1/2/3' не запишите
И в третьих - сделайте SIGUSR2 для убиения процессов (или явно их kill'ом побейте)

Добавлено через 1 минуту и 35 секунд
Кстати, и process_write вполне может быть одним на все 3 потомка - сделайте переменную 'c' глобальной и устанавливайте ее в '1/2/3' после соответствующего fork'а

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

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

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


 




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


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

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