LINUX.ORG.RU

правильная работа SIGTSTP

 ,


0

2

Добрый вечер, не понимаю как приостановить новый процесс. SIGINT нормально работает и завершает процесс и возвращает в мою программу, а SIGTSTP срабатывает но возврата в мою программу нет, никакой реакции пока не нажму ^C. подскажите пожалуйста как правильно реализовать?

 void	ft_fun_fork(char *path, char **arg) /*функция создания нового процесса*/
{
	pid_t	pid;

	pid = fork();
	signal(SIGINT, ft_fork_signal);
	signal(SIGTSTP, ft_fork_signal);
	if (pid == 0)
		execve(path, arg, g_env);
	else if (pid < 0)
	{
		free(path);
		ft_putendl("Fork failed to create a new process.");
		return ;
	}
	wait(&pid);
	if (path)
		free(path);
}

void	ft_fork_signal(int signo)
{

	if (signo == SIGINT)
	{
		ft_putstr("\n");
		signal(SIGINT, ft_fork_signal);
		// exit(EXIT_SUCCESS);
	}
	else if (signo == SIGTSTP)
	{
		// kill(getpid(), SIGTSTP);
		ft_putstr("\n");
		// signal(SIGTSTP, ft_fork_signal);
		signal(SIGSTOP, SIG_DFL);
	}
}

SIGSTOP (и SIGTSTP) останавливает выполнение процесса. Из того же остановленного процесса ты не сможешь послать SIGCONT, потому что процесс остановлен. Вот такая вот банальность. Но можешь послать из другого рабочего процесса, который знает pid остановленного (например, родительского).

anonymous ()
Ответ на: комментарий от best_elfo

В языке C++ есть свои средства для многопоточного программирования, например std::thread. В языке Си такого нет. В стандарте Си начиная с C11 описаны функции для создания тредов и работы с ними https://en.cppreference.com/w/c/thread - это в threads.h - в стандарте плюсов такого вообще нету. В Си и в C++ еще можно использовать функции, стандартизированные в POSIX - pthread_create, pthread_exit и прочее. Можно использовать fork, можно использовать Linux-специфичный вызов clone. Можно использовать какое-нибудь виндовое API, типа NtCreateProcess и еще черт знает что. В винде еще есть свои какие-то виндоспецифичные семафоры и критические секции, и их можно вызывать из Си и из C++.

В общем я не очень понимаю, каким конкретно вещам будут учить, когда написано «С/С++»

SZT ★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от best_elfo

Вот именно. НЕ понимаешь. А учат годноте.

Я не о том, годнота или нет. Я о том, что нечего смешивать C и C++.

Инструменты вторичны.

Вторичны по отношению к чему? В чем смысл этих шаблонных фраз? Раз инструменты такие вторичные, давайте на Befunge всё писать.

ИМХО, на ЛОРе лишь бы всем доказать что прав только ты )))

Мне совершенно нет дела до того, чтоб кому-то что-то доказывать.

SZT ★★★★ ()
Ответ на: комментарий от SZT

С++ включает в себя большую часть C для совместимости. В g++ прекрасно работают threads.h. Я использую в c++ сишные аналоги чего-либо, если c++ аналог не даёт явных преимуществ.

anonymous ()
Ответ на: комментарий от SZT

И тем не менее ты именно доказываешь упорантский шаблон с/с++, до которого скатываются только последние зануды. Плюсы включают большую часть сей, оба языка используют те же библиотеки, в т.ч. системные. Поэтому название с/с++ имеет смысл просто само по себе, а в данном случае вообще обязательно, т.к. рецепты валидны для обоих языков.

filosofia ()
Ответ на: комментарий от SZT

Да ты даже не понимаешь, что там проводятся различия. Но обплевать «всегда готов». Как вы мне дороги, знатоки. Матов на вас не хватает. Зато накарябать - «НЕ ТО» - это мы можем.

ПИШУ ПРЯМО: ты не в теме. Зря влез. Выглядишь просто… Жаль мне погроммистов, похожих на тебя.

best_elfo ()
Ответ на: комментарий от t184256

Учить надо понятиям, принципам, примитивам там, а это все вторичное

А потом появляются люди, у которых в головах эта C/C++ каша... как это все знакомо

SZT ★★★★ ()
Ответ на: комментарий от SZT

мне ты безразличен. Я впервые за много времени решил помочь. У человека плавает база по вопросу. Есть годнота, которую я порекомендовал. Сразу появляется некий перец и пишет «фууу», не заобравшись. Так вот, ТС, прости. Дальше я учавствовать в данной беседе не намерен. Удачи в изучении.

А тебе, SZT - уважай мнение других, или проходи по ссылке и смотри программу. Читай, короче, если вступительное видео корона смотреть мешает.

best_elfo ()
Ответ на: комментарий от best_elfo

А тебе, SZT - уважай мнение других, или проходи по ссылке и смотри программу. Читай, короче, если вступительное видео корона смотреть мешает.

Так я посмотрел. И «Course content» посмотрел. Там упомянуты, цитирую:

  1. Контейнеры
  2. Умные указатели
  3. Аллокаторы

Т.е. там рассказывают про какие-то C++ вещи, которые к Си и к многопоточному программированию прямого отношения не имеют, ты считаешь что топикстартеру это все надо изучать чтоб разобраться с многопоточностью в Си через форки, позикс-треды и сигналы?

Я б рекомендовал какой-нибудь курс по системному программированию конкретно на Си и конкретно под POSIX-совместимые системы, в котором бы рассматривались позикс-специфичные сигналы, треды и прочее, а не какое-то «C/C++» где еще что-то про контейнеры и смартпоинтеры.

А эмоции и оценочные суждения оставьте при себе. Всего хорошего :)

SZT ★★★★ ()
Ответ на: комментарий от anonymous

Так проблема в том что например в своей программе запускаю ls -R / он создает новый процесс я нажимаю ^Z он приостанавливается, но мне никак его не возобновить, потому что нет возврата к основной программе

diosio ()
Ответ на: комментарий от diosio

Ну значит пошли сигнал SIGCONT тому остановленному процессу ls -R /. Я не очень понимаю твою проблему. Тебе нужен какой-то работающий в фоне процесс, который бы следил за статусом запущенного процесса, и будил его если он остановится? Или что ты хочешь?

SZT ★★★★ ()
Ответ на: комментарий от diosio

После приостановки нового процесса он не возвращается к родительскому.

А он и не должен. Чтоб вернуться к родительскому, надо чтоб новый процесс завершился. Это так работает

SZT ★★★★ ()
Ответ на: комментарий от diosio

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

SZT ★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)