gpt4 book ai didi

c - 使用 sigaction 和指令 SIGINT 的信号处理程序。结构变量 : no storage size of sa is known 失败

转载 作者:太空狗 更新时间:2023-10-29 16:01:53 24 4
gpt4 key购买 nike

我是 C 编程的菜鸟。我只是想制作一个程序,如果用户在三秒钟内点击三次 CRTL+C,它就会注册。我的问题是终端总是说:'sa' 的存储大小未知。我在网上搜索了很多例子,但似乎总是同样的问题。可能是包含部分有问题,所以我发布了所有代码。

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


int counter=0;
int counter2=0;
//time timestart;
//time timeend;
void signalHandler(int signum);
void ALARMhandler(int sig);
void SIGHUPhandler();
void SIGUSR1handler();


void signalHandler(int signum){
alarm(3);
//printf("the signal caught %d\n", signum);
if (signum == SIGUSR1){
printf("received SIGUSR1\n");
signal(SIGUSR1, SIGUSR1handler);
counter++;
}else if (signum == SIGKILL){
printf("received SIGKILL\n");
counter++;
}else if (signum == SIGSTOP){
printf("received SIGSTOP\n");
counter++;
}else if(counter>=3){
printf("shut program");

}else if (signum == SIGINT){// sorry sigint can't be handled
printf("received SIGint\n");
counter++;
}else if(signum== SIGALRM ){
printf("recived SIGALRM\n");
signal(SIGALRM, ALARMhandler);
counter++;
}else if(signum== SIGHUP){
printf("recived SIGHUP\n");
signal(SIGHUP, SIGHUPhandler);
}
//exit(signum);
}


int main( void )
{
/* Place your handler somewhere around here */
clock_t timeStart, timeEnd;
printf( "Hello World!\n" );
//for ( ;; )
//{
/* infinite loop */
//}

struct sigaction sa;
memset (&sa, 0, sizeof(sa));
sa.sa_handler = signalHandler;
//sigemptyset(&sa.sa_mask);
//sa.sa_flags = SA_RESTART;


counter++;

while(counter2<3){
printf("please press CRTL+C\n");
timeStart=clock();
//sigaction(SIGINT, &sa, NULL);
pause();
timeEnd=clock();
if (timeEnd - timeStart < 3){
counter++;
}else if(timeEnd - timeStart ==3){
printf("shutting down\n");
exit(1);
}//end esle if


counter2++;

}
printf("shutting down\n");
return 0;

问题似乎出在这个声明中:struct sigaction sa;终端显示:'sa' 的存储大小未知

我知道 struct 的参数必须声明,但我在网上看到很多没有声明的例子。我做错了什么?

最佳答案

我猜您是在 C99 下编译。如果是,则需要#define_XOPEN_SOURCE 以便sigaction 和 friend 可用。如果您使用选项 -D_XOPEN_SOURCE 进行编译,它应该可以工作。

关于c - 使用 sigaction 和指令 SIGINT 的信号处理程序。结构变量 : no storage size of sa is known 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20493604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com