Проблема с обработчиками сигналов - PullRequest
0 голосов
/ 08 апреля 2010

как можно что-то напечатать 3 раза, если код печати идет только дважды?Я кодирую на C, а код находится в обработчике сигнала SIGCHLD, который я создал.

void chld_signalHandler() {
 int pidadf = (int) getpid();
 printf("pidafdfaddf: %d\n", pidadf);

 while (1) {
  int termChildPID = waitpid(-1, NULL, WNOHANG);

  if (termChildPID == 0 || termChildPID == -1) {
   break;
  }

  dll_node_t *temp = head;
  while (temp != NULL) {
   printf("stuff\n");
   if (temp->pid == termChildPID && temp->type == WORK) {
    printf("inside if\n");

    // read memory mapped file b/w WORKER and MAIN
    // get statistics and write results to pipe
    char resultString[256];

    // printing TIME
    int i;
    for (i = 0; i < 24; i++) {
     sprintf(resultString, "TIME; %d ; %d ; %d ; %s\n",i,1,2,temp->stats->mboxFileName);
     fwrite(resultString, strlen(resultString), 1, pipeFD);
    }

    remove_node(temp);
    break;
   }
   temp = temp->next;
  }
  printf("done printing from sigchld \n");
 }
 return;
}

вывод для моего процесса MAIN следующий:

MAIN PROCESS 16214 created WORKER PROCESS 16220 for file class.sp10.cs241.mbox
pidafdfaddf: 16214
stuff
stuff
inside if
done printing from sigchld 
MAIN PROCESS 16214 created WORKER PROCESS 16221 for file class.sp10.cs225.mbox
pidafdfaddf: 16214
stuff
stuff
inside if
done printing from sigchld 

, а вывод для процесса MONITOR такой:

MONITOR: pipe is open for reading
MONITOR PIPE: TIME; 0 ; 1 ; 2 ; class.sp10.cs225.mbox
MONITOR PIPE: TIME; 0 ; 1 ; 2 ; class.sp10.cs225.mbox
MONITOR PIPE: TIME; 0 ; 1 ; 2 ; class.sp10.cs241.mbox
MONITOR: end of readpipe 

(у меня естьубрал повторяющиеся строки, чтобы я не занимал так много места)

Спасибо, Христо

1 Ответ

1 голос
/ 08 апреля 2010

Из небольшого количества информации у нас есть ...

  1. Основной процесс создает рабочий процесс с pid = 16220
  2. Рабочий процесс 16220 запускается и завершается
  3. Обработчик сигнала работает, и, очевидно, второй узел в списке «head» имеет запись для идентификатора процесса 16220 («stuff» печатает дважды, а «inside if» печатает один раз).
  4. Основной процесс создает рабочий процесс с pid = 16221
  5. Рабочий процесс 16221 запускается и завершается
  6. Обработчик сигнала работает, и, очевидно, второй узел в списке «head» имеет запись для идентификатора процесса 16221 («stuff» печатает дважды, а «inside if» печатает один раз).

Это все, что мы можем почерпнуть из предоставленных вами данных. Если вам нужно было передать параметр stat для waitpid, вы могли бы понять, почему рабочие процессы были прерваны, распечатав termChildPID и причину завершения в обработчике.

Если ваш вопрос заключается в том, почему «набивка» печатается дважды, посмотрите, на что указывает «голова».

...