2009-11-01 2 views
0

У меня есть консольная программа, и я хочу, если пользователь нажмет ctrl-z, программа выйдет, и если он нажмет ctrl-c, ничего не произойдет. В Bash я бы поставил ловушку, что я должен использовать на C++?«Ловушка» control-d и control-c

+0

Имеет ли ваша консольная программа более сложный интерфейс, чем обычный процессор stdin/stdout? Что это? – Juliano

+0

Нет, это очень просто – Hai

ответ

5

В Unix используйте signal() в <signal.h>, чтобы зарегистрировать функцию для вызова при получении сигнала.

Например:

#include <signal.h> 

void leave(int sig); 

// ... 
{ 
    signal(SIGINT,leave); 
    for(;;) getchar(); 
} 

// Beware: calling library fn from signal handler isn't std-conforming 
//   and may not work. 
void leave(int sig) 
{ 
    exit(sig); 
} 
+1

Вы должны вызывать '_Exit (sig)' вместо 'exit (sig)' здесь. Первый безопасен в обработчиках сигналов, а второй - нет. –

+3

'signal()' ведет себя по-разному на разных платформах. 'sigaction()' немного сложнее, но переносима. –

1

Это определенная платформа, конечно. Сам C++ не знает ввода клавиатуры или обработки сигналов.

Как вы упомянули bash, я думаю, вы находитесь на Linux или какой-то UN * X. В этом случае взгляните на signal.h.

+0

Стандарты C и C++ имеют много общего в отношении обработки сигналов и ввода с клавиатуры. Также нечего сказать о приостановке процесса, хотя и «SIGINT» и «signal()» оба охвачены. –

+0

Я не думаю, что язык C или C++ предполагает, что даже есть клавиатура. Но вы правы, и 'SIGINT', и' signal() 'являются частью стандартного заголовка C signal.h', что означает, что вы можете устанавливать функции обработки сигналов и повышать сигналы. – mkluwe

4

Если вы используете систему на базе UNIX, то вы хотите либо signal(), либо sigaction() в зависимости от вашей модели предпочтения и резьбы; лично, я бы порекомендовал sigaction() более signal(). Вы хотите уловить SIGTSTP и SIGINT. Прочтите the Signal Concepts section of the Single UNIX Specification за хорошее описание того, как их использовать.

Если у вас есть свободное время, ознакомьтесь с классикой W. Richard Steven Advanced Programming in the UNIX Environment. Вы никогда не пожалеете. Если вы планируете выполнять больше задач по программированию системы UNIX, запишите копии POSIX Programmers Guide и POSIX.4 Programmers Guide. Они служат прекрасным знакомством и рекомендациями.

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