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

С++ под Linux

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

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

12.01.2017, 12:25. Просмотров 394. Ответов 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).

Что подскажете?
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2017, 12:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как убить внучатый процесс? (C++ Linux):

Тормозит внучатый процесс - C++ Linux
Господа, Есть процесс, назовем его TWO, который запускает FFMPEG. В качестве параметров передается откуда-куда транслировать медиа,...

Как запустить как дочерний процесс? - C++ Linux
#include <stdio.h> int main() { printf("Child\n"); return 0; } НЕ могу разобраться! Типа такого плана???

Как возникает процесс зомби? - C++ Linux
Собственно как возникает процесс зомби?

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

Корректно убить поток - C++
Пусть имеется поток thrdWork, который обрабатывает большие данные. В результате этой работы в памяти каждый раз сохраняются наиболее лучшие...

Можно ли убить поток (pthread) сигналом (kill()) ? - C++ Linux
Процесс убивается вызовом kill(pid, 9); Как убить не весь процесс а только поток? Можно pthread_cancel + pthread_testcancel, но...

9
bizba
6 / 6 / 4
Регистрация: 29.10.2015
Сообщений: 45
12.01.2017, 14:31 #2
А если убивать так: system("killall chr30")?
0
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.

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

Спасибо.
0
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
12.01.2017, 15:16  [ТС] #4
на всяк случай прикрепил игрушечные файлы
0
Вложения
Тип файла: txt chr15.txt (1.4 Кб, 6 просмотров)
Тип файла: txt chr30.txt (1.5 Кб, 1 просмотров)
Тип файла: txt chr45.txt (1.4 Кб, 1 просмотров)
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
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
Примеры есть внутри.
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
12.01.2017, 19:32 #6
Цитата Сообщение от Vasilich_88 Посмотреть сообщение
хотя ps af выдает в списке chr30
Там есть колонка status (или как-то так называется), наверняка процесс находится в состоянии зомби

Цитата Сообщение от DrOffset Посмотреть сообщение
Забыть про system и использовать связку fork + exec[*] + waitpid
+1
system можно использовать только для того, чтобы что-то на коленке по быстрому сделать. В реальной жизни его никто не использует
0
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?
0
Humanoid
Почетный модератор
9846 / 3743 / 168
Регистрация: 12.06.2008
Сообщений: 11,480
13.01.2017, 12:09 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Vasilich_88 Посмотреть сообщение
ТЕ запустив fork в процессе Chr30 получим дочерний chr30 а не желаемый Chr15.
Да, поэтому и было сказано:
Цитата Сообщение от DrOffset Посмотреть сообщение
использовать связку fork + exec[*] + waitpid
Т.е. fork() создаёт копию текущего процесса, любым наиболее удобным exec'ом дочерний процесс меняется на нужный. А через waitpid() родитель дожидается завершения дочернего процесса.
1
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,972
Записей в блоге: 27
13.01.2017, 12:20 #9
Цитата Сообщение от Humanoid Посмотреть сообщение
Т.е. fork() создаёт копию текущего процесса, любым наиболее удобным exec'ом дочерний процесс меняется на нужный
Внутри system (да и везде) делается то же самое. Как-то вот так в unix'ах устроен процесс создания процесса (простите за тавтологию)
0
Vasilich_88
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 7
13.01.2017, 12:59  [ТС] #10
Отцы, спасибо, проясняется.

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

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

Не прощаюсь,
еще раз спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2017, 12:59
Привет! Вот еще темы с ответами:

Как убить процесс? - C++
Как убить процесс с помощью программы(консольного приложения)?

Как убить процесс? - Visual Basic
Подскажите как убить процесс? Желательно любой (вплоть до win.com) Заранее спасиба за ответ

.NET 4.x Как убить процесс? - C#
Посмотрел на форумах и/к на убивание процесса, у всех делается через код т.е. Process proc = Process.GetProcesses(); ...

Как убить процесс? - C#
Как убить процесс (скайпа) на C#?


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
13.01.2017, 12:59
Ответ Создать тему
Опции темы

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