2010-12-14 12 views
5

C dilinde bir sistem işlev çağrısı kullanılarak yürütülen bir arka plan işlemini nasıl öldürebilirim? Örneğin, derlenmiş bir uygulama çağrım var "fooprocess". Sonra sistem işlevini kullanarak arka planda fooprocess uygulamayı çalıştırır bir program yazmak istiyorum, lütfen, kod lütfen aşağıya bakınSistem işlevinden arka plan işlemini nasıl öldürebilirim

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

bir "&" karakteri vardır görebileceğiniz gibi elimden böylece Fooprocess uygulamasını arka planda çalıştırın. Bu işyerini nasıl öldürebilirim?

Çok teşekkürler.

+1

Belki sistem ("pkill fooprocess"); '? – jweyrich

+0

@jweyrich, teşekkürler bunu deneyin. – domlao

cevap

5

İşlemle etkileşimde bulunabilmek için PID'sine ihtiyacınız vardır. ile mümkün olup olmadığından emin değilim, ancak bir alternatif fork + exec kullanarak işlemi kendiniz çatallamaktır. Bunu kullanarak sorununuzu çalıştık

+0

Teşekkürler, bunun için bazı temel kodları verebilir misiniz? – domlao

+1

'system' ile mümkün değil. Eğer OP'nin sistemi 'posix_spawn' ise, 'fork' ve 'exec''dan daha kolay kullanılır. –

0


:

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

bunu gibi sistemde ki() yerleştirebilirsiniz:

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

çalışacak O.

+0

Tüm sahip olduğunuz bir çekiç ... –

+0

@Adam Rosenfield: Bu ne anlama geliyor? :-) –

+2

Söylemeye çalıştığım şey, 'sistem'in iş için yanlış bir araç olmasıdır. "Sahip olduğun her şey bir çekiç olduğunda, her şey bir çiviye benziyor." Doğru çözüm, çocuk sürecini oluşturmak için 'system' yerine' fork' + 'exec' kullanmaktır ve bu süreçle etkileşimde bulunmak çok daha kolaydır. –

2

Daha sonra izleyebileceğiniz/öldürebileceğiniz arka plan işlemleri oluşturmak için system("foo &"); kesinlikle kullanamazsınız. Bu tür herhangi bir kullanım devasa bir içsel hataya sahiptir: pid'i biliyorsanız bile, bu pid ile işlemin başlangıçta çalıştırdığınız işlem mi, yoksa aynı pid'i almak için olan tamamen farklı bir işlem mi olduğunu anlamanın bir yolu yoktur. . Eğer hiç system işlevi hakkında öğrenilen unutup fork ve exec veya birlikte çocuğunuzun süreçlerini oluşturmalıdır

Bu sorunu çözmek için (eğer düşünmek istemiyorum ve sayısız diğer sorun veya kafanı zarar yapacak) posix_spawn. Bu, doğrudan çocuk işlemiyle sonuçlanacak (geçerli yönteminiz wait/ waitpid oturumunu açıp wait/ waitpid oturumunu çalıştıran ve init işlemiyle alınan torunları oluşturacaktır) ve wait işlemi gerçekleştirinceye kadar, alt işlemin pid'i size aittir ve yeniden kullanılamaz, bu yüzden ona sinyal göndermek için güvenli, vb