The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Sigaction"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Sigaction"  
Сообщение от psh email on 07-Мрт-06, 22:51 
Здравствуйте,
Существует программка:

Code:
#include <stdlib.h>
#include <signal.h>

int i;

void sighandler(){
   printf("Catched signal\n");
   printf("Reset i value\n");
   i=0;
}

int main(int argc,char *argv){
   struct sigaction sact;
   sact.sa_handler=sighandler;
   sigaction(SIGINT,&sact,NULL);
   for(i=0;;i++){
      printf("%d\n",i);
      sleep(3);
   }
   return(0);
}


Она печатает возрастающие числа пока не встретит прерывание (насколько я понимаю - CTRL/C. Правильно? [Вопрос 1])

если внутри функции main изменить
sigaction(SIGINT,&sact,NULL);
на
sigaction(SIGQUIT,&sact,NULL);
то, встретив все тот же, CTRL/C - срабатывает выход. Почему?! [Вопрос 2]
Как заставить программу реагировать на CTRL/D? [Вопрос 3]

Уверен вы знаете, подскажете?
Заранее спасибо, psh

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

  • Sigaction, chip, 12:49 , 08-Мрт-06, (1)  
    • Sigaction, psh, 17:10 , 08-Мрт-06, (2)  
      • Sigaction, chip, 23:04 , 08-Мрт-06, (3)  

Сообщения по теме [Сортировка по времени, UBB]


1. "Sigaction"  
Сообщение от chip email(ok) on 08-Мрт-06, 12:49 
>Здравствуйте,
>Существует программка:
>
>Code:
>#include <stdlib.h>
>#include <signal.h>
>
>int i;
>
>void sighandler(){
>   printf("Catched signal\n");
>   printf("Reset i value\n");
>   i=0;
>}
>
>int main(int argc,char *argv){
>   struct sigaction sact;
>   sact.sa_handler=sighandler;
>   sigaction(SIGINT,&sact,NULL);
>   for(i=0;;i++){
>      printf("%d\n",i);
>      sleep(3);
>   }
>   return(0);
>}
>
>
>Она печатает возрастающие числа пока не встретит прерывание (насколько я понимаю -
>CTRL/C. Правильно? [Вопрос 1])

Correct.

>если внутри функции main изменить
>sigaction(SIGINT,&sact,NULL);
>на
>sigaction(SIGQUIT,&sact,NULL);
>то, встретив все тот же, CTRL/C - срабатывает выход. Почему?! [Вопрос 2]

Срабатывает обработчик по умолчанию для сигнала SIGINT. Он и прерывает обработку программы. Try to add:

signal(SIGINT, SIG_IGN);

>Как заставить программу реагировать на CTRL/D? [Вопрос 3]

Чтением в цикле STDIN + select||poll||epoll||kqueue по желанию.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Sigaction"  
Сообщение от psh email on 08-Мрт-06, 17:10 
>>Как заставить программу реагировать на CTRL/D? [Вопрос 3]
>
>Чтением в цикле STDIN + select||poll||epoll||kqueue по желанию.

Большое спасибо!
Но, не могли бы вы дать примерчик, а то звучит не до конца понятно...

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Sigaction"  
Сообщение от chip email(ok) on 08-Мрт-06, 23:04 
>>>Как заставить программу реагировать на CTRL/D? [Вопрос 3]
>>
>>Чтением в цикле STDIN + select||poll||epoll||kqueue по желанию.
>
>Большое спасибо!
>Но, не могли бы вы дать примерчик, а то звучит не до
>конца понятно...

#include <stdio.h>

int
main(int argc, char *argv[]) {
        int ch;

        while ((ch = getc(stdin)) != EOF)
                printf("%c", ch);
        return 0;
}

Ctrl+D == EOF

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру