TextMate является великим редактором, и существует способ копировать часть функциональности в GEdit. Проверьте статью здесь: http://rubymm.blogspot.com/2007/08/make-gedit-behave-roughly-like-textmate.html для изменения GEdit для поведения как TextMate.
Вы забываете изначально установить обработчик аварийных сигналов. Измените начало main ()
, например:
int main(int argc, char *argv[])
{
signal(SIGALRM, ALARMhandler);
...
Кроме того, обработчик сигнала, вероятно, ничего не напечатает. Это потому, что библиотека C кэширует вывод до тех пор, пока не увидит конец строки. Итак:
void ALARMhandler(int sig)
{
signal(SIGALRM, SIG_IGN); /* ignore this signal */
printf("Hello\n");
signal(SIGALRM, ALARMhandler); /* reinstall the handler */
}
Для реальной программы печать из обработчика сигнала не очень безопасна. Обработчик сигнала должен делать как можно меньше, желательно только устанавливать флаг здесь или там. И флаг должен быть объявлен изменчивым
.
Вы не устанавливаете обработчик в своей функции main
.
Перед тем как сделать alarm (2)
, установите signal (SIGALRM, ALARMhandler);
в вашем main
.
Тогда он должен работать.
Обратите внимание, что ваше «Все готово» никогда не будет напечатано, потому что вы останетесь в while (1) цикл после запуска сигнального процессора. Если вы хотите, чтобы цикл был прерван, вам понадобится флаг, который изменит обработчик сигнала.
#include <stdio.h>
#include <signal.h>
/* number of times the handle will run: */
volatile int breakflag = 3;
void handle(int sig) {
printf("Hello\n");
--breakflag;
alarm(1);
}
int main() {
signal(SIGALRM, handle);
alarm(1);
while(breakflag) { sleep(1); }
printf("done\n");
return 0;
}
Вы не устанавливаете сначала обработчик сигналов.
Вам необходимо сообщить системе, что вы хотите обработать сигнал, до того, как он будет получен, поэтому вам нужно вызвать signal ()
из основного до того, как сигнал придет.
int main(int argc, char *argv[])
{
signal(SIGALRM, ALARMhandler); /* install the handler */
alarm(2); /* set alarm clock */
while (1);
}