【问题标题】:Problem with signal handlers信号处理程序的问题
【发布时间】:2010-04-08 02:10:19
【问题描述】:

当它只打印两次代码时,它怎么能打印 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 

(我已经把重复的行去掉了,所以我不占用太多空间)

谢谢, 赫里斯托

【问题讨论】:

  • 这是重复的,因为有人在没有给我回复机会的情况下关闭了我的帖子。
  • 如果您的问题第一次被关闭,是什么让您认为第二次会做得更好?不要重复发布,至少想出一个真实的标题。
  • 你需要做的是返回并编辑你原来的问题,这样代码的格式会更好,它有一个描述性的标题,并被标记(阅读:分类) 正确。然后去 meta.stackoverflow.com 发帖解释你解决了这个问题并请求人们投票重新打开它。
  • @Joel Coahoorn:在他编辑之前它已经关闭,因为当时这个问题没有意义。这不是他最初的问题的欺骗,这只是这次正确发布问题的正常尝试。

标签: c process signals


【解决方案1】:

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

  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 和终止原因来了解为什么工作进程终止。

如果您的问题是为什么“stuff”会打印两次,那么请查看“head”指向的内容。

【讨论】:

  • 感谢您的回复。我发现了我的问题并解决了它。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多