Как убить фоновый процесс из вызова системной функции - PullRequest
5 голосов
/ 14 декабря 2010

Как убить фоновый процесс, который был выполнен с помощью вызова системной функции на языке Си. Как, например, у меня есть скомпилированный вызов приложения "fooprocess". Затем я хочу написать программу, которая будет выполнять приложение fooprocess в фоновом режиме, используя системную функцию, пожалуйста, смотрите ниже код,

const char app[] = "fooprocess &";
system(app);

Как видите, есть символ "&", чтобы я мог запускать приложение fooprocess в фоновом режиме. Как я могу убить этот fooprocess?

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

Для взаимодействия с процессом вам нужен его PID. Я не уверен, возможно ли это с system, но одна альтернатива - это сам форкнуть процесс, используя fork + exec.

2 голосов
/ 14 декабря 2010

Вы абсолютно не можете использовать system("foo &"); для создания фоновых процессов, которые впоследствии сможете отслеживать / уничтожать.Любое такое использование имеет гигантскую присущую ошибку: даже если вы знаете pid, невозможно определить, является ли процесс с этим pid процессом, который вы изначально выполняли, или совершенно другим процессом, который, как оказалось, получилтот же pid позже.

Чтобы решить эту проблему (и бесчисленное множество других проблем, о которых вы не хотите думать, или это повредит вашей голове), вы должны забыть, что вы когда-либо узнали о функции system, и создатьваш ребенок обрабатывает с fork и exec или posix_spawn.Это приведет к прямому дочернему процессу (ваш текущий метод создает внуков, которые осиротят и будут поглощены процессом init), который вы можете wait / waitpid включить, и до тех пор, пока вы не выполните операцию wait,pid дочернего процесса принадлежит вам и не может быть повторно использован, поэтому безопасно отправлять на него сигналы и т. д.

0 голосов
/ 14 декабря 2010


Я пробовал вашу проблему, используя это:

ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill  

вы можете поместить это в system () следующим образом:

system("ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill");

Это будет работать.

...