【问题标题】:How to use signals properly in C?如何在 C 中正确使用信号?
【发布时间】:2013-11-05 23:58:04
【问题描述】:

我必须编写一个名为 BuzzOff.c 的程序。我的程序必须接受 3 个整数参数:

$ BuzzOff 10 99999 2

我的程序应该悄悄地从 0 计数到 0.001 的增量,并且 保持和计数器的结果的总和, 即total += count * <arg1>;

我已经阅读了信号,但我仍然不确定它们是如何工作的。如何让我的程序在收到 SIGUSR1 时打印当前的运行总计?

这是我目前所拥有的:

#include<stdio.h>
#include<signal.h>

float total;

void sig_handler(int signo)
{
    if (signo == SIGUSR1)
      printf("total: %f\n", total);
}

int main(int argc, char *argv[])
{
    if( argc!=4 ) {
        printf("need three arguments\n"); return(1);
    }
    float count;

    for (count = 0; count < argv[3]; count += 0.001)
      total += count*argv[2];

    return 0;

}

【问题讨论】:

  • 也许您(应该)收到的编译器错误会为您指明正确的方向。
  • 你有比信号更大的问题,在这里,SO 并不是让别人教你信号如何工作的正确地方,但你基本上必须 (1) 注册你的信号处理程序,最好使用sigaction(); (2) 实际上以某种方式将信号发送到您的进程。 printf() 和朋友在信号处理程序中使用通常是不安全的,尽管在这种特殊情况下您不会遇到任何问题。
  • 而且你也可能在使用这样的全局变量时遇到问题。 sig_atomic_t 会比float 好,但sig_atomic_t 是一个整数类型。

标签: c signals signal-handling


【解决方案1】:

您需要为 SIGUSR1 指定处理程序。

有点像..

信号(SIGUSR1,sig_handler);

并在 main() 中调用它

【讨论】:

  • 如果我想打印当前的运行总计,我会在我的 for 循环之前还是之后调用它?
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2013-01-06
  • 2021-01-17
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多