Witam. Właśnie piszę program, który wysyła sygnał do procesu potomnego. Problem pojawia się jednak, gdy wysyłam np. sygnał nr 19. Proces potomny zostaje zatrzymany (ok), ale proces macierzysty nagle staje się procesem - zombie. Czy można temu jakoś zapobiec?
Kod:
a.c - wywoływany jako potomny:
#include <signal.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
if (argc<3)
{
printf("Za mala liczba argumentow!\n");
return 1;
}
__sighandler_t obsluga;
const int sig = atoi(argv[1]);
const int arg2 = strtol(argv[2], NULL, 0);
if(arg2==1)
{
obsluga=SIG_DFL;
const __sighandler_t obsluga=obsluga;
}
else if(arg2==2)
{
obsluga=SIG_IGN;
const __sighandler_t obsluga=obsluga;
}
else if(arg2==3)
{
printf("Wlasna obsluga sygnalu\n");
}
else printf("Nieprawidlowy sposob obslugi!\n");
signal(sig, obsluga);
pause();
return 0;
}
b.c:
#define _POSIX_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
if (argc<3)
{
printf("Za mala liczba argumentow!\n");
return 1;
}
const int sig = atoi(argv[1]);
switch(fork())
{
case -1:
perror("Blad funkcji fork().\n");
exit(1);
break;
case 0:
execl("./a.x", "a.x", argv[1], argv[2], NULL);
perror("Blad fukcji exec().\n");
_exit(2);
break;
default:
sleep(2);
kill(getppid(), sig);
break;
}
return 0;