【问题标题】:alarm() function not going off at right time警报()函数没有在正确的时间关闭
【发布时间】:2013-11-06 23:14:07
【问题描述】:

我有一个程序应该从命令行接收 3 个不同的参数。第三个参数是传递给警报函数的唯一参数。例如,如果我的程序名为 BuzzOff,它的工作方式如下:

$ BuzzOff 10 99999 1

第三个参数是 1,所以 1 将被传递给警报函数。我的程序应该每 arg3 秒打印一次变量 total 的值。在这种情况下,每 1 秒。但是,当我尝试使用 1 作为我的第三个参数时,警报需要的时间比 1 秒长得多。大约需要 14 秒。无论我使用什么作为我的 arg3,它似乎都以相同的速度打印。我是否正确实现了警报功能?

这是我的代码:

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

double arg1, arg2, arg3;
double total = 0;
int debug = 0;

void sigusr1_handler(int signo)
{
    if (signo == SIGUSR1)
      printf("total: %f\n", total);
}
void sigusr2_handler(int signo)
{
    if (signo == SIGUSR2)
      debug = ((debug == 1) ? 0 : 1);
}
void sigint_handler(int signo)
{
  if (signo == SIGINT)
    {
      printf("total: %f\n", total);
      exit(0);
    }
}
void sigalrm_handler(int signo)
{
  if (signo == SIGALRM)
    {
      printf("total: %f\n", total);
      signal(SIGALRM, sigalrm_handler);
      alarm(arg3);
    }
}

int main(int argc, char *argv[])
{
    if( argc!=4 ) {
        printf("need three arguments\n"); return(1);
    }
    arg1 = (double) atoi(argv[1]);
    arg2 = (double) atoi(argv[2]);
    arg3 = (double) atoi(argv[3]);

    double count;

    signal(SIGUSR1, sigusr1_handler);
    signal(SIGUSR2, sigusr2_handler);
    raise(SIGUSR2);
    if (debug == 1)
      {
    signal(SIGUSR1, SIG_IGN);
    signal(SIGALRM, sigalrm_handler);
    alarm(arg3);
      }
    else if (debug == 0)
      {
    signal(SIGUSR1, sigusr1_handler);
    signal(SIGINT, sigint_handler);
      }
    for (count = 0; count < arg2; count += 0.001)
      {
    total += count*arg1;
      }
    return 0;

}

【问题讨论】:

  • 您不需要将arg3 设为双精度,您只需要一个无符号整数。但我不相信这会阻止它发挥作用。
  • 事实证明确实如此。谢谢!

标签: c printing signals printf alarm


【解决方案1】:

您将输入转换为double,但alarm() 函数需要unsigned int。不知道 1.0 的下半部分(上半部分)的位模式是什么,但如果它显示为 14,我不会感到惊讶。

编译器不会抱怨将double arg3 传递给alarm() 吗?

【讨论】:

  • 不,编译器什么也没说。我将尝试将 arg3 设为无符号整数。
  • 是的,在使 arg3 成为无符号整数后,程序可以工作。非常感谢!
  • 噢,我已经很久没有真正破解过一些 C 语言了。在 C 语言中,double 确实和 int 一样好,而且没有编译器警告。嗯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多