zamkniecie procesu po nazwie

0

Cześć. Mam problem z wysłaniem sygnału zamknięcia procesu z programu w języku C.

po numerze pid jest to tak:

kill(pid, SIGTERM) 

A jak będzie, żeby nie wpisywać numeru PID tylko nazwę? Bo nie mogę znaleźć :(

Z góry dziękuję za pomoc.
Pozdrawiam.

0

W katalogu /proc masz pidy, a w numerze cmdline masz teoretycznie nazwę procesu wywołania.

0

Głównie chodzi o to, ze mam włączone dwa programy o nazwie test.out. Jak je zamknąć z poziomu programu po nazwie? nazwę wystarczy mi jak wpiszę na sztywno.

0

Kryterium systemu operacyjnego nie jest "nazwa procesu" tylko PID i jedyne co możesz zrobić to wysłać do konkretnego procesu identyfikowanego numerem PID sygnał.

Nie ma w systemie operacyjnym metod, które pozwalałyby wysłać sygnał do "procesu o nazwie XXX" chociażby z tego powodu, że PID danego procesu jest unikalny w danym momencie działania, a nazwa nie.
Jedyne wyjście to grepowanie i selekcjonowanie pidów, a następnie wysyłanie do nich sygnałów, co chociażby robi pkill:

pkill -9 test.out

0

Z nudów ci napisałem, niby działa.

class psaux(object):
    def __init__(self):
        self.list = []
        self.open()

    def printf(self):
        for a in self.list:
            print 'PID: %s NAME: %s' % (a[0], a[1])

    def open(self):
        import os
        l = os.listdir('/proc')
        for a in l:
            if a.isdigit():
                str = '/proc/%s/comm' % a
                temp = open(str, 'rb').read()
                self.list.append((a, temp))


if __name__ == "__main__":
    a = psaux()
    a.printf()
0

Może bardziej szczegółowo opisze o co chodzi. Napisałem program do obsługi kolejek. Klient - Serwer. I teraz jest taka sprawa, że odpalam 1 serwer i kilku klientów, jeżeli klient wyśle słowo koniec to serwer kończy działanie oraz ten klient który wysłał to słowo. No ale trzeba jeszcze zamknąć jakoś tego drugiego klienta, i właśnie nie bardzo wiem jak..

0

@marnit: Te odpowiedzi, które tutaj dostajesz są specyficzne dla danego systemu operacyjnego. Dla Linuksa masz katalog /proc z katalogami o numerach zgodnych z PIDami procesów (patrz, kod powyżej). We FreeBSD masz dla C elegancką bibliotekę libprocstat: https://www.freebsd.org/cgi/man.cgi?query=libprocstat&sektion=3. W obu zapewne dałoby się to wyciągnąć ze struktur pracującego kernela przez urządzenie /dev/kmem - tego podejścia gorąco nie polecam. Nieważne, jak tego dokonasz za każdym razem przelatujesz po liście procesów i pobierasz PIDy tych, których nazwa Ci pasuje i do nich ślesz sygnał.

Edit:
niech klient śledzi stan połączenia. Jak mu się serwer rozłączy niech spróbuje się podłączyć jeszcze raz, jak to się nie uda - serwer zmarł koniec pracy.

Edit2:
albo niech przed końcem pracy roześle instrukcję zamknięcia dla pozostałych. Jeśli ten program ma działać na więcej niż jednej maszynie, to nie masz innej drogi.

0

Zrób getpid i prześlij pid procesu i jak kipnie proces to ten drugi popełni samobojstwo

A kipnięciem możesz tak zrobić.

int func(){
return 1;
}

exit:
func();
asm("int 0x80");
 
0
 int a = getpid(); // pid klienta
send(a); // wysyłasz do serwera
recv(b);
if (praca_end == true) kill(b); 
0

W sensie, że w serwerze mam dodać:

if(wiadomosc.dziala == 0)       
    kill(wiadomosc.adres, SIGTERM);

1 użytkowników online, w tym zalogowanych: 0, gości: 1