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

Бодибилдинг, пауэрлифтинг, фитнес - спорт.портал АТЛЕТ.RU
Фото

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


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

#1
Offline zloy_tapok
23.05.2019 - 19:22 PM

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

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

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

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

Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. При этом каждый из дочерних процессов особым образом реагирует на сигнал 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


#2
Offline zloy_tapok
27.05.2019 - 12:39 PM

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

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

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

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

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

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

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


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


#3
Offline Crusher
14.06.2019 - 14:46 PM

Crusher
  • Форумчане
  • Нихуху не нейтральный киприот!

  • Сообщений: 2357
  • Регистрация: 22.01.09
  • Откуда:Свердловск
  • Вес / Рост: 91/186
  • Стаж / Возраст: 31/41
  • Кто: атлет
Репутация:

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

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

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

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

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

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



#4
Offline zloy_tapok
14.06.2019 - 16:37 PM

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

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


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

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

#5
Offline Crusher
14.06.2019 - 17:37 PM

Crusher
  • Форумчане
  • Нихуху не нейтральный киприот!

  • Сообщений: 2357
  • Регистрация: 22.01.09
  • Откуда:Свердловск
  • Вес / Рост: 91/186
  • Стаж / Возраст: 31/41
  • Кто: атлет
Репутация:

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

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



#6
Offline zloy_tapok
14.06.2019 - 18:01 PM

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

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

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

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

#7
Offline Crusher
14.06.2019 - 19:27 PM

Crusher
  • Форумчане
  • Нихуху не нейтральный киприот!

  • Сообщений: 2357
  • Регистрация: 22.01.09
  • Откуда:Свердловск
  • Вес / Рост: 91/186
  • Стаж / Возраст: 31/41
  • Кто: атлет
Репутация:

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

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
Offline zloy_tapok
15.06.2019 - 03:16 AM

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

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

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

#9
Offline rodya
21.10.2020 - 12:24 PM

rodya
  • Гости
  • Атлет

  • Сообщений: 0
  • Регистрация: 08.09.20
  • Вес / Рост: 82/178
  • Стаж / Возраст: 0/30
  • Кто: не спортсмен
Репутация:

 

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

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

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

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

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

 

А код теперь то можно вернуть?)






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

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