LINUX.ORG.RU

Завершение дочерних процессов

 , ,


0

2

Добрый день.

Программа на С запускает дочерний процесс с помощью функций fork() и execlp(). Получить pid основного процесса не представляется сложным. Убить его также не сложно. Возник вопрос, можно ли убить все возникшие в ходе выполнения программы дочерние процессы. При этом, чтобы программа продолжила спокойно выполнятся дальше.

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

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

сейчас структура программы такая:

Программа TEST ... if (условие) pid=fork(); if (pif==0) exec(вызов программы); else вот тут надо убить дочерние процессы

Проверял по PID, структура примерно такая: PID PPID Имя проццеса 2 1 TEST 3 2 процесс вызванный в EXEC (omxplayer) 10 3 процесс созданный omxplayer

Нужно «убить» PID 10... PID 2 и 3 в программе получить могу. PID последнего потомка нет... Беда

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

как ты «убиваешь» процесс omxplayer? если дочерний его процесс в той же группе (pgroup), он тоже получит сигнал. сделай ps -eo sess,pgrp,ppid,pid,comm чтобы увидеть группу процессов. если его дочерний процесс сознательно помещен в отдельную группу, то «чистого» способа добиться желаймого нет — есть разной степени хаки. можно загнать их в cgroup/session и убить все в cgroup/session; можно подменить через ldpreload fork для omxplayer, с тем чтобы записывать его результат; можно в конце-концов искать всех «детей» твоего дочернего omxplayer через /proc.

а что ты вообще пытаешься сделать?

val-amart ★★★★★ ()

Закидывай в список все пиды дочерних процессов, потом отсылай им сигналы. И еще

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от val-amart

Задача стоит следующая: 1. есть RaspberryPI 2. с помощью omxplayer при загрузке системы запустить аудиодорожку №1 (это сделано) 3. сделать обработку состояния входов RBPI - при подаче на один вход сигнала высокого уровня: 3.1. запускается omxplayer, который начинает проигрывать аудиодорожку №2 (первая работает). при подаче сигнала низкого уровня 3.2. аудиодорожка №2 останавливается

Аудиодорожка №1 должна остаться нетронутой.

Задача - сделать это на С.

Я предположил, что это моно решить: 1. запустить аудиодорожку №1 прописав команду на е запуск в автозагрузку 2. написать на С программку с применение wiringPi библиотеки для обработка состояния входов 3. В цикле опрашивать состояние входа и при изменении уровня сигнала сначала запустить воспроизведение аудио с помощью комбинации fork(), exec() 4. Убить запущенный дочерний процесс с помощью kill(PID,-9)

По факту получается: 1. обрабатываю состояние входа 2. запускаю аудиод. При этом вызов fork()+execelp(«omxplayer»,) привод к тому, что в основном процессе (TEST) создается дочерний процесс omxplayer, а к этому процессу создается еще один дочерний, который проигрывает аудио (или что-то делает с этим аудиофайлом). Убить omxplayer удается без проблем. Но при этом его потомок, который собственно и отвечает за работу аудио продолжает работать.

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

умм. ну тогда во-первых подойдет любой из предложенных ранее вариантов, во-вторых, я не знаю зачем так усложнять. если обязательно использовать Си и omxplayer, у него есть интерфейс d-bus, вот тут примеры: https://github.com/popcornmix/omxplayer/blob/master/dbuscontrol.sh Если не обязательно, то это все делается шеллскриптом на максимум 10 строчек, причем если вам не надо запускать и останавливать это аудио сотни тысяч раз в секунду, в чем я сомневаюсь, то разницы в производительности не будет *ни-ка-кой*.

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