Procesy Zombie

Potrzebujesz pomocy z C, C++, perl, python, itp.
szpuni
Beginner
Posty: 112
Rejestracja: 15 stycznia 2007, 15:25
Lokalizacja: dublin

Procesy Zombie

Post autor: szpuni »

Witam,

Mam maly skrypt napisany w perlu ktory sobie nasluchuje na jakims tam porcie.
Klient wysyla zadania aktywujace jakies funkcje, w tym wypadku regolki iptables.

Gdy client rozlaczy sie z serwerem powstaje mi proces zombie.
Chcialbym dodac funkcje do tego aby procesy zombie byly zabijane automatycznie.
Wiem ze istnieje jakas opcja perla aby to osiagnac.

Slyszal ktos moze o tym?
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Ale pozostaje Ci proces zombie po kliencie? Toworzysz gdzieś procesy potomne za pomocą funkcji fork()?
szpuni
Beginner
Posty: 112
Rejestracja: 15 stycznia 2007, 15:25
Lokalizacja: dublin

Post autor: szpuni »

Dokladnie tak:

Kod: Zaznacz cały

while(1) {
        &initialise;
        $sock = IO::Socket::INET->new(PeerAddr => "192.168.1.133", PeerPort => 2424, Timeout => 2) or logprint("Can't connect! $!\n");
        while (!$sock) {
                sleep(10);

                $sock = IO::Socket::INET->new(PeerAddr => "192.168.1.133", PeerPort => 2424, Timeout => 2) or logprint("Can't connect! $!\n");
                #$sock = IO::Socket::INET->new("192.168.1.133:2425") or print("\nCan't connect! $!\n");
        }
        &initialise;

        my $pid = fork();
        if (!$pid) { # this is child process
                print "Listening...\n";
                while (<$sock>) {
Nie jest to kod napisany przezemnie chce go tylko usprawnic.

wykaz z ps

Kod: Zaznacz cały

1 Z     0 26034 20898  0  76   0 -     0 exit   pts/3    00:00:00 perl <defunct>
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Poczytaj sobie trochę o tym np na Wikipedii. A tymczasem spróbuj zmodyfikować część odpowiadającą za tworzenie procesów potomnych w taki sposób:

Kod: Zaznacz cały

$pid = fork();
if ($pid) {
  waitpid ($pid ,-1);
}
elsif ($pid == 0) {
print "Listening...\n"; 
while (<$sock>) {
.
.
.
}
exit(0);
}   
else {
  die "couldn't fork: $!\n";
}
szpuni
Beginner
Posty: 112
Rejestracja: 15 stycznia 2007, 15:25
Lokalizacja: dublin

Post autor: szpuni »

Dobrze, dziękuję za podpowiedź.

Sprawdzę to i zobaczymy co z tego wyjdzie.

Pozdrawiam.

[Dodano: 2009-07-09, 10:40]
Niestety rozwiązanie nie załatwia sprawy.

Problem w tym, że gdy klient jest połączony z serwerem jest dobrze.
Ale gdy klient się rozłączy z serwerem od razu mam proces zombie.

Potrzebuję czegoś takiego gdy się rozłączy klient żeby zabił mi proces dziecka.
leon1313
Posty: 13
Rejestracja: 20 września 2007, 03:42

Post autor: leon1313 »

Może spróbuj na wątkach.
ODPOWIEDZ