Форум программистов, компьютерный форум CyberForum.ru

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
#1

Как убить внучатый процесс? - C++ Linux

12.01.2017, 12:25. Просмотров 242. Ответов 9
Метки нет (Все метки)

Приветствую.

Есть три процесса:

chr45(бесконечный) -> запускает сhr30 (должен завершиться через 30 секунд)-> запускает chr15(бесконечный).

Проблема в том, что при завершении chr30 нужно убить и порожденный им chr15 а этого не получается.

Процессы запускаю через system("chrx").

Убивать пробовал system("kill -15 -getpid(chr30)) - при этом выдается сообщение, что процесс (chr30) не найден, хотя ps af выдает в списке chr30.

Только после system("kill -15 -PID_старшего chr45) удаляются все 3 запущенные процесса.

Играю с Raspbian ( Debian jessie).

Что подскажете?
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bizba
6 / 6 / 4
Регистрация: 29.10.2015
Сообщений: 44
12.01.2017, 14:31     Как убить внучатый процесс? #2
А если убивать так: system("killall chr30")?
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
12.01.2017, 15:06  [ТС]     Как убить внучатый процесс? #3
буду пробовать, но сомневаюсь в успехе: при запуске kill (через system) из chr30 он не находит процесс chr30.

так что kill pid or allkill pid should be the same.

Но пробовать будем.

Спасибо.
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
12.01.2017, 15:16  [ТС]     Как убить внучатый процесс? #4
на всяк случай прикрепил игрушечные файлы
Вложения
Тип файла: txt chr15.txt (1.4 Кб, 6 просмотров)
Тип файла: txt chr30.txt (1.5 Кб, 1 просмотров)
Тип файла: txt chr45.txt (1.4 Кб, 1 просмотров)
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
12.01.2017, 19:11     Как убить внучатый процесс? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Vasilich_88 Посмотреть сообщение
Что подскажете?
Забыть про system и использовать связку fork + exec[*] + waitpid.
Можно будет и pid получить убиения процесса и дождаться завершения, и даже отсчитать 30 секунд до момента завершения.
man страницы:
fork: http://man7.org/linux/man-pages/man2/fork.2.html
семейство exeс[*]: http://man7.org/linux/man-pages/man3/exec.3.html
waitpid: http://man7.org/linux/man-pages/man2/waitpid.2.html
Примеры есть внутри.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
12.01.2017, 19:32     Как убить внучатый процесс? #6
Цитата Сообщение от Vasilich_88 Посмотреть сообщение
хотя ps af выдает в списке chr30
Там есть колонка status (или как-то так называется), наверняка процесс находится в состоянии зомби

Цитата Сообщение от DrOffset Посмотреть сообщение
Забыть про system и использовать связку fork + exec[*] + waitpid
+1
system можно использовать только для того, чтобы что-то на коленке по быстрому сделать. В реальной жизни его никто не использует
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
13.01.2017, 10:38  [ТС]     Как убить внучатый процесс? #7
system можно использовать только для того, чтобы что-то на коленке по быстрому сделать. В реальной жизни его никто не использует

- Подозревал подобное.Вопрос ПОЧЕМУ оставим за кадром, хотя любопытно. Спасибо.

В описании FORK настораживает :

fork() creates a new process by \color{red}{duplicating }the calling process.

ТЕ запустив fork в процессе Chr30 получим дочерний chr30 а не желаемый Chr15.

Может posix_spawn?
Humanoid
Почетный модератор
 Аватар для Humanoid
9783 / 3781 / 151
Регистрация: 12.06.2008
Сообщений: 11,378
13.01.2017, 12:09     Как убить внучатый процесс? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Vasilich_88 Посмотреть сообщение
ТЕ запустив fork в процессе Chr30 получим дочерний chr30 а не желаемый Chr15.
Да, поэтому и было сказано:
Цитата Сообщение от DrOffset Посмотреть сообщение
использовать связку fork + exec[*] + waitpid
Т.е. fork() создаёт копию текущего процесса, любым наиболее удобным exec'ом дочерний процесс меняется на нужный. А через waitpid() родитель дожидается завершения дочернего процесса.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
13.01.2017, 12:20     Как убить внучатый процесс? #9
Цитата Сообщение от Humanoid Посмотреть сообщение
Т.е. fork() создаёт копию текущего процесса, любым наиболее удобным exec'ом дочерний процесс меняется на нужный
Внутри system (да и везде) делается то же самое. Как-то вот так в unix'ах устроен процесс создания процесса (простите за тавтологию)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2017, 12:59     Как убить внучатый процесс?
Еще ссылки по теме:

C++ Linux Дочерний процесс
C++ Linux Как запустить как дочерний процесс?
C++ Linux Передать параметр в дочерний процесс через execl()
C++ Linux Как возникает процесс зомби?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
13.01.2017, 12:59  [ТС]     Как убить внучатый процесс? #10
Отцы, спасибо, проясняется.

Читал по отдельности форк и экзек и не нравились они мне.

А так-то, ежели вместе, то вроде как и ничего... Буду постигать дальше.

Не прощаюсь,
еще раз спасибо.
Yandex
Объявления
13.01.2017, 12:59     Как убить внучатый процесс?
Ответ Создать тему
Опции темы

Текущее время: 00:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru