2012-01-13 80 views
2

我正在编写一个C程序,其中父进程为n子进程。一旦创建的子进程调用一个SIGSTOP来允许创建其他子进程。创建所有子进程后,父进程向所有子进程发送一个SIGCONT信号。在Ctrl-C上终止父进程和子进程

所有子进程执行无限循环并使用信号量共享公共资源。现在我希望每当用户按下ctrl-c时,父级和所有子级进程一起终止。但是,在终止子进程之前,应该在文件中更新每个进程使用该资源的次数。

如:

Process 1 - 5 times 
Process 2 - 3 times 

等。

在此实现,请需要帮助...

+3

你有什么?你需要哪些部分帮助?您将需要SIGINT的信号处理程序(但可能不需要SIGCONT)。因此你应该看看'sigaction()'。我猜你已经有信号量代码了? – 2012-01-13 18:23:05

+0

重复? http://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits包含一个很好的答案。 – ugoren 2012-01-13 19:34:03

+1

@JonathanLeffler信号量部分对我来说工作得很好。我坚持的是,在按ctrl-c退出子进程的部分应该首先在文件中更新每次使用资源的次数。此后,孩子和父母一个接一个终止。 – ritz 2012-01-13 19:54:45

回答

2

正式的信号处理函数应尽可能少做。 C标准说它可以写入一个volatile sig_atomic_t变量,或者拨打abort()_Exit()(或者有限制地,signal())。 POSIX允许更多的事情发生,你可能正在使用Linux(尽管你没有这么说)。因此,您的信号处理程序会将sig_atomic_t变量的值从0更改为1,以指示发生信号。

所以,你的子进程将循环。作为循环条件的一部分,您应该检查sig_atomic_t变量以查看是否应终止子进程。当它检测到信号发生时,它将停止循环,打开日志文件进行追加,将其信息写入该文件并退出。您可以在处理中的其他位置检查sig_atomic_t变量,而不仅仅是主循环条件。那是你的决定。

请注意,您应该使用sigaction()而不是signal()来控制信号处理,并且您应该在处理信号时阻止中断。

因此,要总结:

  • 信号处理程序做尽可能少。
  • 您的代码在主循环中检测到信号处理程序已被调用并安排退出。
  • 您的代码也可以检测到信号处理程序何时在其他方便点被调用。
  • 您可以调用一个函数来执行日志记录并退出。
0

为了写文件,你需要添加的代码写入到所述在SIGINT信号处理程序文件。如果您希望每个进程都写入该文件,则需要确保将SIGINT发送到整个进程组。

您可能不需要发送SIGQUIT给每个SIGQUIT,因为每个进程在处理SIGINT后都可以简单地退出。如果你想优化一点,你可以保持一个共享的数据结构,哪些进程已经收到SIGINT,这样你就不会为每个进程发送几个SIGINT。