两个编译器(clang和gcc)对信号有不同的api?

两个编译器(clang和gcc)对信号有不同的api?,gcc,compiler-construction,clang,signals,Gcc,Compiler Construction,Clang,Signals,用c表示: #include <stdio.h> #include <unistd.h> #include <signal.h> void handler(int num){ write(1, "I won't die!\n", 13); } int main(){ signal(SIGINT, handler); while(1){ printf("wastings cycles. %

用c表示:

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

void handler(int num){
    write(1, "I won't die!\n", 13);
}

int main(){
    signal(SIGINT, handler);
    while(1){
        printf("wastings cycles. %i\n",getpid());
        sleep(1);
    }
}
但是第二次按下C^,它将死亡:

wastings cycles. 19361
^C
Command terminated
那是给gcc的。但是,对于使用clang编译的:

wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!

它永远不会死。为什么?它是相同的源代码,相同的hader
signal.h
,但其他编译器使用不同的输出。Gcc!=叮当声。有人能解释一下为什么会有这种差异吗?

在使用gcc 8.3.0的PI4上的Rappian raspberrypi 4.19.118下,无论我按下itI的次数多少,Cntrl-C都不会杀死程序。使用x64 debian 10请查看哪个显示gcc会产生这两种行为,具体取决于它是否被告知使用C11。Posix(和我)建议不要向信号处理者灌输
信号
;改为使用
sigaction
,并考虑您使用的标志。(如果您的问题由另一个答案回答,请告诉我,以便我们可以将此答案标记为副本。谢谢。)
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!
wastings cycles. 22247
^CI won't die!