Обработка сигналов в C
Как я могу реализовать обработку сигналов для Ctrl-C и Ctrl-D в C.... Итак, если нажата комбинация Ctrl-C, программа проигнорирует и попытается снова получить данные от пользователя... Если Ctrl -D, то программа завершится...
Моя программа:
int main(){
char msg[400];
while(1){
printf("Enter: ");
fgets(msg,400,stdin);
printf("%s\n",msg);
}
}
Спасибо,
Dave
Ответы
Ответ 1
При работе с сигналами POSIX у вас есть два средства. Во-первых, простой (но устаревший) способ, signal(). Во-вторых, более элегантный, но сложный, sigaction(). Используйте sigaction(), если вы не обнаружите, что он недоступен на какой-либо платформе, на которой вам нужно работать.
Эта глава руководства glibc объясняет различия между ними и дает хороший пример кода о том, как использовать оба. Он также перечисляет сигналы, которые можно обрабатывать, рекомендует, как их следует обрабатывать, и более подробно рассказывается о том, как рассказать, как обрабатывается какой-либо данный сигнал (или нет). Таким образом, больше кода, чем я хотел бы вставить в ответ здесь, следовательно, ссылки.
Действительно, стоит час или два, чтобы вы могли прочитать ссылки и работать с примерами. Обработка сигналов (особенно в программах, которые демонизируют) чрезвычайно важна. Хорошая программа должна обрабатывать все фатальные сигналы, которые могут обрабатываться (то есть SIGHUP), и явно игнорировать сигналы, которые он может не использовать (например, SIGUSR1/SIGUSR2).
Также не будет больно изучать разницу между нормальными и реальными сигналами времени, по крайней мере, до понимания того, как ядро объединяет предыдущее, а не последнее.
Как только вы его проработаете, вы, вероятно, почувствуете склонность писать простой и удобный набор функций для обработки ваших сигналов и повторного использования этого кода снова и снова.
Извините за то, что вы не указали быстрый и грязный фрагмент кода, чтобы показать вам, как решить вашу неотложную задачу, но это не быстрый и грязный вопрос:)
Ответ 2
Во-первых, 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 */
}
Ответ 3
В вашем примере вам, скорее всего, не нужна рукоятка CTRL-C. "Сигнал (SIGINT, SIG_IGN)" кажется вам достаточным, если ваше приложение не должно обрабатывать SIGINT, исходящий из какого-либо другого источника.
CTRL-D обычно не генерирует сигналы, он просто передает состояние EOF.
Вы можете вообще контролировать поведение вашего терминала (речь идет о консольном вводе, это не так), используя termios library ( также здесь). Вы можете включить, переопределить или отключить символ прерывания (CTRL-C), EOF один и многие другие (XON, XOFF, управление модемом...)
С уважением
Ответ 4
Это программа для обработки сигнала при нажатии Ctrl + c
Синтаксис для функции сигнала: 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");
}
Ответ 5
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
void signal_catch()
{
printf("hi,Your signal catched Here");
}
int main()
{
signal(SIGINT,signal_catch);
//press ctrl+c
sleep(10);
return 0;
}//end main
//if you want to simply ignore ctrl+c interrupt use following code in main
int main()
{
signal(SIGINT,SIG_IGN);
sleep(100);
return 0;
}//end main
//this program wont accept ctrl+c interrupt for 100 seconds.