2013-02-04 7 views
0

Я попытался написать функции обработки сигналов в ubuntu. Код следующим образом:Функциональные возможности обработки сигналов в Ubuntu 11.04

#include<signal.h> 
    void abc(); 

    main(){ 

    printf("Press Ctrl-z key to send SIGINT signal"); 
    signal(SIGINT,abc); 
    for(;;); 
    } 
    void abc(){ 
    printf("The key has been pressed"); 
    } 

межжала фактор: а) Сначала Е() не показана б) Так же как и второй Е();

Я написал код из книги. Может ли кто-нибудь рассказать мне, какие ошибки я сделал или будет ли код изменен для ubuntu.

Thanx заранее.

ответ

0

stdout - это буферизированная линия.

Вы хотели бы добавить в \n к строкам, передаваемым printf():

printf("The key has been pressed.\n"); 

Если Crtl-C нажимается SIGINT отправляется в запущенном процессе на переднем плане. Обработчик по умолчанию для SIGINT завершает работу приложения.

Как приложение в OP в устанавливает обработчик сигнала для SIGINT, который не заканчивается приложением, он продолжает работать, если Ctrl-C нажимается и поэтому SIGINT приподнят. Он вызывается на Ctl-C, пока он остается установленным.

Для достижения поведения, имеющих abc() вызывается только один раз, изменить обработчик сигнала следующим образом:

void abc(int sig) /* 'sig' gets the signal nuber passed in (here: 'SIGINT') */ 
{ 
    printf("The key has been pressed.\n"); 
    signal(sig, SIG_DFT); /* (re-)sets the signal handler for `sig` to the default handler. */ 
} 

Дополнительные показания: man signal, man sigaction

+0

большое спасибо. Но ваш ответ и мой вывод программы ставят несколько вопросов: можете ли вы ответить на это: а) какова логика, заключающаяся в том, что \ n выполняет функции сигнала, которые я сделал? b) Мой вывод продолжает показывать DEL IS PRESSED, если нажать ctrl-c. Он завершает aftr и нажимает ctrl-z. Но моя логика говорит, что «DEL нажата» будет отображаться один раз и aftr, если я нажму ctl-c, он закончится. Может ли вы объяснить логику? Еще раз большое спасибо. – user2015915

+0

@ user2015915 Похоже, что вы возились с 'stty' ...« Обычно »,' SIGINT', соответствует 'ctrl-c', а не' ctrl-z' (что обычно означает 'SIGTSTP') и' DEL' не связан с сигналом. Здесь не совсем ясно, что именно вы пытаетесь сделать ... – twalberg

+0

@twalberg: Sry.I написал этот код из книги, основанной на UNIX, где они используют сигнал DEL.I did not get that it ctrl-c ot ctrl -z. Но его ctrl-c, потому что, если u нажимает ctrl-z, то abc() не выполнил. Мой вывод будет, aftr нажав ctrl-c, он покажет второй printf(), скорее завершающий процесс. Теория говорит, что если u нажмет ctrl-c для времени scnd, она закончится. Но в моем случае scnd printf() выполняется до тех пор, пока u нажимает ctrl-c – user2015915

Смежные вопросы