2

我的导师发布了这个程序来举例说明信号,我试图编译它,但我收到了三个警告:

Buzzoff.c:17:5: warning: implicit declaration of function 'alarm' is invalid in
  C99 [-Wimplicit-function-declaration]
  alarm(2);
  ^
Buzzoff.c:21:5: warning: implicitly declaring library function 'exit' with type
  'void (int) __attribute__((noreturn))'
   exit(-1);
   ^
Buzzoff.c:21:5: note: please include the header <stdlib.h> or explicitly provide
  a declaration for 'exit'
Buzzoff.c:33:5: warning: implicit declaration of function 'pause' is invalid in
  C99 [-Wimplicit-function-declaration]
pause();
^
3 warnings generated.

我仍然不明白信号是如何工作的,而且似乎无法弄清楚这个程序到底出了什么问题。有人可以帮助我了解问题所在以及如何解决吗?

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

void handler(int s)
{
  printf("Please wake up 1730 !!!!!!! \n");
}
int cnt = 0;

void boom(int s) 
{ 
  if (cnt<5) {
    printf("tick\n");
    cnt = cnt+1;
    alarm(2);
  }
  else {
    printf("Boom!\n");
    exit(-1);
 }  
}

int main()
{
   signal(SIGINT, handler);
   signal(SIGALRM, boom);  

   alarm(5);
   while(1) {
    printf("...ZZZZzzzzz...\n");
    pause();
 }

} 
4

2 回答 2

5

signal除了已弃用并sigaction替换它的事实之外,代码没有任何问题。唯一的问题是有些文件应该被包含,但它们不是编译器试图告诉你的。

但是,代码包含正确的头文件!alarmand pauseare defined in unistd.hand exitis defined in stdlib.h,两者都包括在内。如果您的编译器抱怨这些文件,则说明编译器或标准库的安装有问题。

可能的问题可能是糟糕的操作系统(读取 Windows)、错误的安装(通过疯狂的 Linux 发行版)或您自己做错的事情,例如移动一些您不应该拥有的文件。不理解alarmpause提示非 POSIX 操作系统,例如 Windows。但是,不理解exit暗示编译器本身存在一些非常错误的问题。

您还可以发布您执行的命令来编译代码吗?你不会因为某种原因碰巧包括在内-nostdinc,是吗?

于 2013-11-06T18:39:14.287 回答
1

在 Mac 和 BSD 上,只需给终端一个罢工:

NAME alarm -- 设置信号定时器报警

LIBRARY 标准 C 库 (libc, -lc)

概要 #include <unistd.h>

所以你应该简单地包含 unistd.h,然后你就明白了。

我在终端上尝试了我的 BigSur:

ingconti@MBP-32GB-BigSur 信号 % ./stackoverflow

...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
Boom!

所以它可以在 Mac 上运行!

于 2021-03-14T20:17:15.743 回答