Перейти к содержимому

Фото

Управление процессами Linux на Си


  • Чтобы отвечать, сперва войдите на форум
7 ответов в теме

#1
Online zloy_tapok
23.05.2019 - 19:22 PM

zloy_tapok
  • Форумчане
  • Атлет

  • Сообщений: 1277
  • Регистрация: 05.03.18
  • Откуда:Белогорск, Амурская обл.
  • Вес / Рост: 90/173
  • Стаж / Возраст: 5/30
  • Кто: лифтер
Репутация:

Знаю, что здесь много ИТшников, может кто поможет.
Я студент счас, и делаю всякие задания перед сессией (которая на носу).
Сегодня просидел сутки, и зашел в тупик. Не могу выполнить следующую задачу:
 

Написать программу:

Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. При этом каждый из дочерних процессов особым образом реагирует на сигнал SIGINT:

  •  процесс 1 при получении сигнала SIGINT выводит сообщение на экран и продолжается;
  • процесс 2 обрабатывает сигнал SIGINT в бесконечном цикле, выдавая свое сообщение на экран. Данный цикл защищен от воздействия сигнала SIGQUIT;
  • вся программа процесса 3 защищена от воздействия сигнала SIGINT;
  • перед входом процесса 4 в бесконечный цикл для него меняется идентификатор сеанса.

Сразу после порождения дочерних процессов процесс-отец завершается.
Далее следует проверить реакцию оставшихся процессов на сигналы SIGINT и SIGQUIT.

 

 

Написать надо на Си под Unix. Используются функции sigaction, fork, getpid.

 

Проблема в том, что везде разбираются примеры с созданием всего 2х процессов. Отца и потомка. И функция fork возвращает 0 или не 0. По которым можно отличить процессы. Что на примерах и разбирают, с помощью цикла IF легко разделяются процессы, и потом можно спокойно с каждым работать.

Но, чтобы отделить 4 процесса, я написал дикий говнокод с 4мя вложенными циклами If, в котором еще вложенные бесконечные циклы while. Ну не должно быть, я сам уже запутался в том, что несколько часов писал.

 

Может кому знакома такая задача? Создание и управление несколькими процессами на языке Си под Linux (unix)?

 

Буду признателен за помощь. 

Если остальные задачи на Си я сделал, да и уроков хватает (в принципе основы изучил), то по этой теме маловато информации в Рунете. А забугорную инфу я уже не могу усвоить. Ухожу спать, ибо с 9 утра до 1:20 ночи просидел в кресле. Сплошной катаболизм))

 

В рунете нашел, где три процесса делают. Там реально вложенные циклы IF используют. Но бля, это издевательство какое-то) Как-бы не пришлось покупать. Именно эта лабораторная работа висит на одном из сайтов за 750 рублей)


Изменено: zloy_tapok, 23.05.2019 - 19:29 PM


Online Body-Factory

Body-Factory
  • Представители
  • Интернет-магазин

  • Сообщений: 123
  • Регистрация: 05.05.18
Большой выбор качественного спортивного питания по демократичным ценам в интернет-магазине Body-Factory.
Самовывоз и быстрая доставка во все города России!
Заказать спортивное питание можно перейдя по ссылке *

* для всех участников форума athlete.ru скидка 5% по промокоду athlete

    #2
    Online zloy_tapok
    27.05.2019 - 12:39 PM

    zloy_tapok
    • Форумчане
    • Атлет

    • Сообщений: 1277
    • Регистрация: 05.03.18
    • Откуда:Белогорск, Амурская обл.
    • Вес / Рост: 90/173
    • Стаж / Возраст: 5/30
    • Кто: лифтер
    Репутация:

    Отдохнул, развеялся. Посидел денек на работе и накатал такой вот код. Нашел похожие куски примеров и пару статей на хабре. Решил, что покупать всякие работы по профилю учебы не буду - программирование и все такое надо самому сделать. 

    Если кому интересно:

    Решил пока код убрать, ведь работу еще не зачли. 

    В-принципе тему можно снести или закрыть)

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


    Изменено: zloy_tapok, 27.05.2019 - 12:42 PM


    #3
    Offline Genitor
    14.06.2019 - 14:46 PM

    Genitor
    • Форумчане
    • Каналья

    • Сообщений: 1118
    • Регистрация: 22.01.09
    • Откуда:Екатеринбург/Кипр
    • Вес / Рост: 84-92/186
    • Стаж / Возраст: 25/36
    • Кто: атлет
    Репутация:

    Проблема в том, что везде разбираются примеры с созданием всего 2х процессов. Отца и потомка. И функция fork возвращает 0 или не 0. По которым можно отличить процессы. Что на примерах и разбирают, с помощью цикла IF легко разделяются процессы, и потом можно спокойно с каждым работать. Но, чтобы отделить 4 процесса, я написал дикий говнокод с 4мя вложенными циклами If, в котором еще вложенные бесконечные циклы while. Ну не должно быть, я сам уже запутался в том, что несколько часов писал.
     

    Увидел только сейчас, но все же. 

    Главный процесс выполняет 4 вызова spawn_child() с разными параметрами, и выходит.

    spawn_child() - это твоя функция, которая форкает процесс и запускает логику сына, а для отца - просто выходит.

    Параметром может быть просто функция, которую должен выполнить сын.

    "Бизнес-логику" сына выполняешь в ней, зачем какие-то вложенные циклы и прочее?



    #4
    Online zloy_tapok
    14.06.2019 - 16:37 PM

    zloy_tapok
    • Форумчане
    • Атлет

    • Сообщений: 1277
    • Регистрация: 05.03.18
    • Откуда:Белогорск, Амурская обл.
    • Вес / Рост: 90/173
    • Стаж / Возраст: 5/30
    • Кто: лифтер
    Репутация:


    Увидел только сейчас, но все же.
    Главный процесс выполняет 4 вызова spawn_child() с разными параметрами, и выходит.
    spawn_child() - это твоя функция, которая форкает процесс и запускает логику сына, а для отца - просто выходит.
    Параметром может быть просто функция, которую должен выполнить сын.
    "Бизнес-логику" сына выполняешь в ней, зачем какие-то вложенные циклы и прочее?

    В лабораторной можно использовать только то, что разрешено. Типо приходили. Этой функции там нет.
    Кстати, уже сдал ее. Сессию тоже сдал.

    #5
    Offline Genitor
    14.06.2019 - 17:37 PM

    Genitor
    • Форумчане
    • Каналья

    • Сообщений: 1118
    • Регистрация: 22.01.09
    • Откуда:Екатеринбург/Кипр
    • Вес / Рост: 84-92/186
    • Стаж / Возраст: 25/36
    • Кто: атлет
    Репутация:

    В лабораторной можно использовать только то, что разрешено. Типо приходили. Этой функции там нет.
    Кстати, уже сдал ее. Сессию тоже сдал.

    Ты не понял, это была бы твоя функция. Молодец)



    #6
    Online zloy_tapok
    14.06.2019 - 18:01 PM

    zloy_tapok
    • Форумчане
    • Атлет

    • Сообщений: 1277
    • Регистрация: 05.03.18
    • Откуда:Белогорск, Амурская обл.
    • Вес / Рост: 90/173
    • Стаж / Возраст: 5/30
    • Кто: лифтер
    Репутация:

    Ты не понял, это была бы твоя функция. Молодец)

    Действительно не сообразил.
    Накидай код если не сложно, даже для одного потомка.

    #7
    Offline Genitor
    14.06.2019 - 19:27 PM

    Genitor
    • Форумчане
    • Каналья

    • Сообщений: 1118
    • Регистрация: 22.01.09
    • Откуда:Екатеринбург/Кипр
    • Вес / Рост: 84-92/186
    • Стаж / Возраст: 25/36
    • Кто: атлет
    Репутация:

    Негде собрать и проверить, как-то так. Техзадание скудное, конечно.

    typedef void (*child_t)();
    
    void spawn_child(child_t func)
    {
    	int pid = fork();
    	if (pid != 0)
    		return;
    		
    	// invoke child's logic
    	func();
    	// exit child's process
    	exit(0);
    }
    
    void int_handler(int)
    {
    	puts("SIGINT");
    }
    
    void proc1()
    {
    	struct sigaction action;
    	memset(&action, 0, sizeof(action));
    	action.sa_handler = &int_handler;
    	sigaction(SIGINT, &action, NULL);
    	
    	while (true)
    	{
    	}
    }
    
    void parent()
    {
    	spawn_child(proc1);
    	spawn_child(proc2);
    	...
    }
    


    #8
    Online zloy_tapok
    15.06.2019 - 03:16 AM

    zloy_tapok
    • Форумчане
    • Атлет

    • Сообщений: 1277
    • Регистрация: 05.03.18
    • Откуда:Белогорск, Амурская обл.
    • Вес / Рост: 90/173
    • Стаж / Возраст: 5/30
    • Кто: лифтер
    Репутация:
    Кстати ну похоже. Я тоже функцию задал, и потом определил соответствующие реакции на сигналы.
    Потом через case разделял и углублялся.

    Скорее всего или завтра или в понедельник проверю на своей виртуалке Убунту.
    Спасибо, жаль, что раньше не написал))




    0 пользователей читают эту тему

    0 пользователей, 0 гостей, 0 невидимых