Даже если вы исправите код, чтобы он компилировался (вы не определили tempPID), существуют проблемы:
- Вы заставляете ребенка спать, пока не придет сигнал.
- Вы заставляете родителя ждать, пока ребенок не умрет.
Итак, у вас есть состояние, когда ни один процесс не собирается делать больше ничего.
Возможно, вам нужен родитель, чтобы отправить сигнал ребенку:
kill(pid, SIGINT);
- Не ясно, нужен ли родитель для установки обработчика сигнала.
- Возможно, вы хотите, чтобы ребенок установил обработчик сигнала.
- Возможно, вам не нужен бесконечный цикл в дочернем элементе.
- О, и
void main()
неверно - int main()
или int main(void)
или int main(int argc, char **argv)
являются утвержденными декларациями для main()
.
- И будет лучше, если вы вернете значение (0) из
main()
. Стандарт C99 позволяет вам опускать конец main()
и будет рассматривать его как возвращающий ноль, но только если функция должным образом объявлена как возвращающая int
.
- Заголовок для
wait()
и родственников в POSIX - <sys/wait.h>
.
И, поскольку я лох, вот код, который компилируется и может даже делать то, что вы хотите:
#include <stdio.h>
#include <signal.h>
#include <unistd.h> /* getpid() */
#include <stdlib.h>
#include <sys/wait.h>
void catchInt(int signum)
{
printf("Child's PID is %d\n", (int)getpid());
printf("My sincerest apologies, master\n");
exit(1);
}
int main()
{
pid_t pid = fork();
if (pid < 0) /* error handler */
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0) /* child */
{
printf("Child reporting in\n");
signal(SIGINT, catchInt);
pause();
}
else /* parent */
{
sleep(1);
kill(pid, SIGINT);
wait(NULL);
printf("You're welcome\n");
}
return(0);
}