Обработка сигналов в C - PullRequest
       16

Обработка сигналов в C

19 голосов
/ 21 марта 2010

Как я могу реализовать Обработка сигналов для 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

Ответы [ 5 ]

31 голосов
/ 21 марта 2010

При работе с сигналами POSIX у вас есть два средства.Во-первых, простой (но не рекомендуемый) способ, signal () .Во-вторых, более элегантный, актуальный, но сложный способ, sigaction () .Пожалуйста, используйте sigaction (), если вы не обнаружите, что он недоступен на какой-то платформе, с которой вам нужно работать.

В этой главе руководства по glibc объясняются различия между ними и дается хорошаяПример кода о том, как использовать оба.В нем также перечислены сигналы, которые могут быть обработаны, даны рекомендации о том, как они должны обрабатываться , и более подробно рассказывается, как определить, каким образом данный сигнал обрабатывается (или не обрабатывается) в настоящее время .,Это намного больше кода, чем я хотел бы вставить в ответ здесь, отсюда и ссылки.

Это действительно стоит часа или двух, которые потребуются вам, чтобы прочитать ссылки и проработать примеры.Обработка сигналов (особенно в программах, которые демонизируют) чрезвычайно важна.Хорошая программа должна обрабатывать все фатальные сигналы, которые могут быть обработаны (например, SIGHUP), и явно игнорировать сигналы, которые она может не использовать (например, SIGUSR1 / SIGUSR2).

Также не помешает изучить разницу междунормальные сигналы и сигналы реального времени, по крайней мере, до понимания того, как ядро ​​объединяет предыдущее, а не второе.

Как только вы поработаете с ним, вы, вероятно, почувствуете склонность написать простой для изменения набор функций для обработки ваших сигналов и повторно использовать этот код снова и снова.

Извинитеза то, что вы не дали быстрый и грязный фрагмент кода, чтобы показать вам, как решить вашу насущную потребность, но это не быстрая и грязная тема:)

14 голосов
/ 21 марта 2010

Во-первых, 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 */
}
2 голосов
/ 22 апреля 2013

Это программа для обработки сигнала при нажатии 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");

}
2 голосов
/ 21 марта 2010

В вашем примере кажется, что вам вообще не нужен указатель CTRL-C.«Сигнал (SIGINT, SIG_IGN)» кажется вам достаточным, если только ваше приложение не должно обрабатывать SIGINT, поступающий из какого-либо другого источника.CTRL-D обычно не генерирует сигналы, он просто сообщает о состоянии EOF.В общем, вы можете контролировать поведение вашего терминала (мы говорим о консольном вводе, не так ли?), Используя termios библиотеку (также здесь ).Вы можете включить, переопределить или отключить символ «прерывание» (CTRL-C), EOF и многие другие (XON, XOFF, управление модемом ...)

С уважением

0 голосов
/ 19 марта 2015
#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. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...