Как убить фоновый процесс из вызова системной функции

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

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

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

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


person domlao    schedule 14.12.2010    source источник
comment
Может system("pkill fooprocess");?   -  person jweyrich    schedule 14.12.2010
comment
@jweyrich, спасибо, попробую.   -  person domlao    schedule 14.12.2010


Ответы (3)


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

person codaddict    schedule 14.12.2010
comment
Это невозможно с system. Если в системе OP есть posix_spawn, ее, вероятно, проще использовать, чем fork и exec. - person R.. GitHub STOP HELPING ICE; 14.12.2010

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

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

person R.. GitHub STOP HELPING ICE    schedule 14.12.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");

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

person Neilvert Noval    schedule 14.12.2010
comment
@ Адам Розенфилд: что это значит? :-) - person Neilvert Noval; 15.12.2010
comment
Я пытаюсь сказать, что system не подходит для этой работы. Когда у тебя есть только молоток, все выглядит как гвоздь. Правильное решение — использовать fork+exec вместо system для порождения дочернего процесса, и тогда будет намного проще взаимодействовать с этим процессом. - person Adam Rosenfield; 15.12.2010