首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C语言中的信号处理

C语言中的信号处理
EN

Stack Overflow用户
提问于 2010-03-21 06:28:55
回答 4查看 42.2K关注 0票数 21

如何在C....So中实现Ctrl-C和Ctrl-D的信号处理如果按下Ctrl-C,则程序将忽略并尝试从用户again...If获取输入。按下Ctrl-D,程序将终止...

我的程序如下:

代码语言:javascript
复制
int main(){
 char msg[400];

 while(1){
   printf("Enter: ");
   fgets(msg,400,stdin);
   printf("%s\n",msg); 
 }
}

谢谢,

戴夫

EN

回答 4

Stack Overflow用户

发布于 2010-03-21 06:42:25

首先,Ctrl+D是一个你不能捕获的EOF指示器,当程序等待输入时,点击Ctrl+D表示文件结束,不会有更多的输入。另一方面,使用Ctrl+C来终止程序-也就是SIGINT,它可以通过这样做来捕获:

代码语言:javascript
复制
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>

static void signal_handler(int);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);

struct sigaction sigact;
char *progname;

int main(int argc, char **argv){
    char *s;
    progname = *(argv);
    atexit(cleanup);
    init_signals();
    // do the work
    exit(0);
}

void init_signals(void){
    sigact.sa_handler = signal_handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = 0;
    sigaction(SIGINT, &sigact, (struct sigaction *)NULL);
}

static void signal_handler(int sig){
    if (sig == SIGINT) panic("Caught signal for Ctrl+C\n");
}

void panic(const char *fmt, ...){
    char buf[50];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(-1);
}

void cleanup(void){
    sigemptyset(&sigact.sa_mask);
    /* Do any cleaning up chores here */
}
票数 14
EN

Stack Overflow用户

发布于 2010-03-21 06:40:37

在您的示例中,您似乎根本不需要CTRL-C handlind。"signal( SIGINT,SIG_IGN)“对你来说似乎足够了,除非你的应用程序必须处理来自其他来源的SIGINT。CTRL-D通常不会生成信号,它只是简单地传达EOF条件。一般来说,您可以控制终端的行为(我们讨论的是控制台输入,不是吗?)通过使用termios library (也可以是here)。您可以启用、重新定义或禁用“中断”字符(CTRL-C)、EOF one和许多其他字符(XON、XOFF、调制解调器控制...)

问候

票数 2
EN

Stack Overflow用户

发布于 2013-04-22 06:32:44

这是一个当按下Ctrl+c时处理信号的程序

signal函数语法为:signal(signal name, function name);

代码语言:javascript
复制
#include<stdio.h>
#include<signal.h>  // for handling signal 

void signal_handler() 
{
    printf("Signal Handled here\n");
}

main() 
{
    printf("In main function..\n");

    // SIGINT is signal name create  when Ctrl+c will pressed 
    signal(SIGINT,signal_handler);  

    sleep(15);

    printf("In main after called from signal_handle \n");

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2485028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档