Спасибо, буду пробовать.
Пользователь решил продолжить мысль 20 Апреля 2010, 22:09:04:
Вот как сейчас выглядит моя программа:
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
pid_t child_1 = 0, child_2 = 0;
void chsigact(int nsig, void (*sa_handlr)(int))
{
struct sigaction act;
act.sa_handler = sa_handlr;
sigaction(nsig, &act, 0);
}
void chsigactinfo(int nsig, void (*sa_sigact)(int, siginfo_t *, void *))
{
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = sa_sigact;
sigaction(nsig, &act, 0);
}
void sighandler(int nsig)
{
struct sigaction act;
printf("child\n");
//chsigact(SIGUSR1, sighandler);
act.sa_handler = sighandler;
sigaction(SIGUSR1, &act, 0);
kill(getppid(), SIGUSR2);
pause();
}
void psighandler(int nsig, siginfo_t * si, void * b)
{
struct sigaction act;
printf("pid: %d 1: %d 2: %d\n", si->si_pid, child_1, child_2);
//chsigactinfo(SIGUSR2, psighandler);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = psighandler;
sigaction(SIGUSR2, &act, 0);
sleep(1);
kill(si->si_pid, SIGUSR1);
//kill(child_2, SIGUSR1);
//kill(child_1, SIGUSR1);
pause();
}
int main()
{
child_1 = fork();
if (child_1 == 0)
{
struct sigaction act;
act.sa_handler = sighandler;
sigaction(SIGUSR1, &act, 0);
// chsigact(SIGUSR1, sighandler);
pause();
}
else if (child_1 > 0)
{
child_2 = fork();
if (child_2 == 0)
{
//chsigact(SIGUSR1, sighandler);
struct sigaction act;
act.sa_handler = sighandler;
sigaction(SIGUSR1, &act, 0);
pause();
}
}
if (child_1 > 0 && child_2 > 0)
{
//chsigactinfo(SIGUSR2, psighandler);
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = psighandler;
sigaction(SIGUSR2, &act, 0);
sleep(1);
kill(child_2, SIGUSR1);
kill(child_1, SIGUSR1);
pause();
}
return 0;
}
Все по-старому: выводится 2 сообщения от детей и 1 от родителя. Заметил очень странную вещь: когда я использовал функции, написанные мной для переопределения функций обработки сигналов(их вызовы закомментированы), программа "висла" после этих сообщений и не завершалась даже по Ctrl+C, а теперешний вариант(его отличие состоит только в том, что не происходит вызова функций) завершается по Ctrl+C нормально. Чем может быть обусловлено такое поведение? И почему моя программа и теперь не хочет бесконечно обмениваться сигналами?