2010-12-14 3 views
5

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

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

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

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

+1

Может быть, 'system (" pkill fooprocess ");'? – jweyrich

+0

@jweyrich, спасибо, что попробуй. – domlao

ответ

5

Чтобы взаимодействовать с процессом, вам нужен его PID. Я не уверен, возможно ли это с помощью system, но один из вариантов заключается в том, чтобы развернуть процесс самостоятельно с помощью fork + exec.

+0

Спасибо, можете ли вы дать базовый код для этого. – domlao

+1

Это невозможно с 'system'. Если система OP имеет 'posix_spawn', ее, вероятно, проще использовать, чем' fork' и 'exec'. –

0


Я попробовал вашу проблему с помощью этого:

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

вы можете, что в системе() следующим образом:

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

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

+0

Когда у вас есть молот ... –

+0

@Adam Rosenfield: что это значит? :-) –

+2

Я пытаюсь сказать, что 'system' является неправильным инструментом для работы. «Когда все, что у вас есть, это молот, все выглядит как гвоздь». Правильное решение - использовать 'fork' +' exec' вместо 'system' для порождения дочернего процесса, а затем гораздо легче взаимодействовать с этим процессом. –

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^