LINUX.ORG.RU

Убивание дочернего процесса


0

0

Всем добрый день. Собственно нужно реализовать сабж, но засада в том, что дочерний процесс меняет эффективный и реальные пользователя и группу, что приводит к тому, что kill не срабатывает, возвращая Operation not permitted. Можно ли решить эту задачу элегантнее, чем привелигированный вызов через оболочку команды kill? Заранее спасибо.


Re: Убивание дочернего процесса

сделать обработчик одного из sigusr'ов в дочернем процессе и в теле обработчика делать exit(x); а из ролительского процесса посылать этот самый sigusr.

asgard ()
Ответ на: Re: Убивание дочернего процесса от asgard

Re: Убивание дочернего процесса

Все хорошо, но сделать я этого не могу, ибо там все немного сложнее. Моя система запускает дочерний процесс, который форкается, меняет uid/gid и запускает абстрактный бинарник. Потом ждет завершения потомка и возвращает код его завершения. Собственно говоря, из системы мне надо погрохать этот абстрактный запущенный бинарник.

Nazgul ()
Ответ на: Re: Убивание дочернего процесса от Nazgul

Re: Убивание дочернего процесса

(не понял, процесс может поменять себе uid, но не может убить кого-то?..)
Imho пример кода не помешал бы. Что-то такое:?

c1pid = fork();
if(c1pid) {
	/* .... */
	/* не важно откуда мы тут знаем c2pid */
	kill(c2pid, SIGINT);
} else {
	c2pid = fork();
	if(c2pid) {
		waitpid(c2pid, ...)
	} else {
		setuid(...);
		exec..(...);
	}
}

alexs ()
Ответ на: Re: Убивание дочернего процесса от alexs

Re: Убивание дочернего процесса

В основной проге идет вызов процесса через пайпу.

pipe=popen ("proc -some-useful-arg prog_to_execute");
..
pclose (pipe);

В proc идет

pid=fork ();
if (!pid) {
  setgroups (0, NULL);
  setregid (gid, gid);
  setreuid (uid, uid);

  execv (...);
  ...
} else {
  ...
  waitpid (-1, &status, WUNTRACED | WCONTINUED);
  ...
}

Ну и необходимо из основной проги иметь возможность убивать этот самый prog_to_execute. Его PID и PID его родителя мне известны.

Может  мои проблемы из-за того, что я SIGTERM посылаю?

Nazgul ()

Re: Убивание дочернего процесса

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

anonymous ()
Ответ на: Re: Убивание дочернего процесса от anonymous

Re: Убивание дочернего процесса

О. Видимо второй вариант самый подходящий для меня будет. Далье уж сам тему разовью. Всем спасибо за помощь. Вопрос закрыт.

Nazgul ()

Re: Убивание дочернего процесса

>дочерний процесс меняет эффективный и реальные пользователя и группу

Реального пользователя и группу может сменить только реальный root. насколько я понял ты не стартуеш от рута посему реальных пользователя и группу ты менять в принципе не можеш даже будучи еффективным рутом.

ещё замечание - обычно родитель *всегда* имеет возможность послать сигнал ребёнку - тоесть проблемы у тебя изза двух колен родства.

cvv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.