代码之家  ›  专栏  ›  技术社区  ›  Hristo

信号处理程序问题

  •  0
  • Hristo  · 技术社区  · 14 年前

    一个东西只打印两次代码,怎么能打印三次呢?我用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 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: 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 回复  |  直到 14 年前
        1
  •  1
  •   Brian Walker    14 年前

    从我们掌握的少量信息来看…

    1. 主进程创建PID=16220的工作进程
    2. 工作进程16220运行并终止
    3. 信号处理程序运行,显然“head”列表中的第二个节点有一个进程id 16220的记录(“stuff”打印两次,“inside if”打印一次)。
    4. 主进程创建PID=16221的工作进程
    5. 工作进程16221运行并终止
    6. 信号处理程序运行,显然“head”列表中的第二个节点有进程id 16221的记录(“stuff”打印两次,“inside if”打印一次)。

    这就是我们从你提供的数据中所能得到的全部信息。如果要将stat参数传递给waitpid,则可以通过在处理程序中打印termchildpid和终止原因来了解为何工作进程终止。

    如果你的问题是为什么“东西”要打印两次,那么看看“头”指的是什么。