我的导师发布了这个程序给出一个信号的例子,我试图编译它但我收到三个警告:
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();
}
}
答案 0 :(得分:4)
除了signal
已被弃用且sigaction
是其替代的事实之外,代码没有任何问题。唯一的问题是应该包含一些文件,但它们不是编译器试图告诉你的。
但是,代码包含正确的头文件! unistd.h
中定义了alarm
和pause
,stdlib.h
中定义了exit
,两者都包括在内。如果您的编译器抱怨这些文件,那么编译器或标准库的安装就会出现问题。
可能的问题可能是糟糕的操作系统(阅读Windows),糟糕的安装(通过疯狂的Linux发行版)或您自己做错的事情,例如移动一些您不应该拥有的文件。不理解非POSIX操作系统(如Windows)上的alarm
和pause
提示。但是,不理解exit
暗示编译器本身的错误。
您是否也可以发布您执行的命令来编译代码?你出于某种原因不会包括-nostdinc
,是吗?
答案 1 :(得分:1)
在 Mac 和 BSD 上只需点击终端:
姓名 闹钟 -- 设置信号定时器闹钟
图书馆 标准 C 库 (libc, -lc)
概要
#include
所以你应该简单地包含 unistd.h,你明白了。
我在终端上试过我的 BigSur:
ingconti@MBP-32GB-BigSur 信号 % ./stackoverflow
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
tick
...ZZZZzzzzz...
Boom!
所以它适用于 Mac!