如何在C....So中实现Ctrl-C和Ctrl-D的信号处理如果按下Ctrl-C,则程序将忽略并尝试从用户again...If获取输入。按下Ctrl-D,程序将终止...
我的程序如下:
int main(){
char msg[400];
while(1){
printf("Enter: ");
fgets(msg,400,stdin);
printf("%s\n",msg);
}
}
谢谢,
戴夫
发布于 2010-03-21 06:42:25
首先,Ctrl+D是一个你不能捕获的EOF指示器,当程序等待输入时,点击Ctrl+D表示文件结束,不会有更多的输入。另一方面,使用Ctrl+C来终止程序-也就是SIGINT,它可以通过这样做来捕获:
#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 */
}
发布于 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、调制解调器控制...)
问候
发布于 2013-04-22 06:32:44
这是一个当按下Ctrl+c时处理信号的程序
signal函数语法为:signal(signal name, function name);
#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");
}
https://stackoverflow.com/questions/2485028
复制相似问题