2010-12-14 12 views
5

Jak mogę zabić proces w tle, który został wykonany przy użyciu funkcji systemowej w języku C. Tak jak na przykład mam skompilowane wywołanie aplikacji "fooprocess". Następnie chcę napisać program, który będzie wykonywał aplikację fooprocess w tle przy użyciu funkcji systemu, proszę zobaczyć poniżej kod,Jak zabić proces w tle z funkcji systemowej zadzwoń

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

Jak widać jest tam znak „&” tak, że mogę uruchom aplikację fooprocess w tle. Jak mogę zabić ten fooproces?

Wielkie dzięki.

+1

Może "system (" popill fooprocess ");'? – jweyrich

+0

@jweyrich, dzięki chory, spróbuj tego. – domlao

Odpowiedz

5

Do interakcji z procesem potrzebny jest jego PID. Nie jestem pewien, czy jest to możliwe z system, ale jedną z możliwości jest rozwidlenie procesu za pomocą fork + exec.

+0

Dzięki, możesz podać podstawowy kod dla tego. – domlao

+1

Nie jest to możliwe w przypadku 'systemu'. Jeśli system OP ma 'posix_spawn', prawdopodobnie jest łatwiejszy w użyciu niż' fork' i 'exec'. –

0


Próbowałem swój problem za pomocą tego:

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

można umieścić, że w systemie() tak:

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

To zadziała.

+0

Kiedy wszystko, co masz, to młot ... –

+0

@Adam Rosenfield: co to znaczy? :-) –

+2

Próbuję powiedzieć, że "system" jest niewłaściwym narzędziem do pracy. "Kiedy wszystko, co masz, to młotek, wszystko wygląda jak gwóźdź". Odpowiednim rozwiązaniem jest użycie 'fork' +' exec' zamiast 'system' do odrodzenia procesu potomnego, a następnie znacznie łatwiej jest wchodzić w interakcje z tym procesem. –

2

Absolutnie nie można użyć system("foo &"); do tworzenia procesów w tle, które można później monitorować/zabijać. Każde takie użycie ma gigantyczny błąd : nawet jeśli znasz ten pid, nie ma możliwości stwierdzenia, czy proces z tym pidem jest procesem, który pierwotnie uruchomiłeś, czy zupełnie innym procesem, który zdarzył się, aby uzyskać ten sam pid później .

Aby rozwiązać ten problem (i niezliczone inne problemy nie chcesz myśleć o tym czy będzie on dokonać ból głowy) należy zapomnieć, że kiedykolwiek dowiedział się o funkcję system i tworzyć procesy potomne z fork i exec lub posix_spawn. Spowoduje to bezpośredni proces potomny (twoja obecna metoda tworzy wnuki osierocone i przechwycone przez proces init), które możesz włączyć, i dopóki nie wykonasz operacji wait, pid procesu potomnego należy do ciebie i nie można go użyć ponownie, więc można bezpiecznie wysyłać do niego sygnały itp.