Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Kidasov
77 / 77 / 12
Регистрация: 02.12.2011
Сообщений: 965
Записей в блоге: 3
#1

Выход по нажатию клавиши из терминала (Linux(UNIX) - C++

26.07.2012, 16:58. Просмотров 1333. Ответов 1
Метки нет (Все метки)

Уважаемые программисты, возникла проблема. Есть клиент, в нем 2 потока. Нужно организовать выход из программы по нажатию комбинации клавиш "Ctrl + D". Вот примерная схема.


C++
1
2
3
4
5
6
7
8
9
10
11
12
void *runStdIn() {
         char message[1024]
         listenSocket(sock, message);
         printf("%s", message);       
}
 
main() {
   pthread_create(&stdInThread, NULL, &runStdIn, NULL);
   while(1) {
        //if ((getche()) == 4) exit(1);
        sendMessage();
   }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 16:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выход по нажатию клавиши из терминала (Linux(UNIX) (C++):

Выход из консоли по нажатию клавиши - C++
Что надо вставить, что бы по нажатию клавиши, скажем, <Enter> произошел выход из консольной программы.

Выход из цикла по нажатию определенной клавиши - C++
Допустим у меня есть какой-нибудь while(1) и мне нужно, чтобы при нажатии, например, esc или enter цикл завершался, как такое сделать? ...

Выход по нажатию ESC - C++
#include "stdafx.h" #include <iostream> #include <conio.h> float sum(); float razn(); float del(); float proizv(); float...

Выход из программы по нажатию Esc - C++
подскажите как сделать чтобы по нажатию ESC выводился результат.затупил чутка int main(){ setlocale(LC_ALL, "RUS"); toll_Both...

Выход из выполнения по нажатию кнопки - C++
Доброго времени суток. Нужен код, с помощью которого можно выйти в любой момент из выполнения программы. Если нагляднее: программы...

Выход из бесконечного цикла по нажатию кнопки. - C++
Привет всем. как можно выйти из такого цикла по нажатию какой любой кнопки (например Esc) int main(){ while(1){ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2012, 18:03 #2
getche() и подобные функции здесь не будут работать. У меня первая мысль была сделать через сигналы, но Ctrl + D не посылает сигнала, это просто символ а-ля EOF.
Вот, что нагуглил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <unistd.h> 
#include <stdio.h> 
#include <termios.h> 
#include <signal.h> 
 
void sig_hnd(int sig){ (void)sig; printf("(VINTR)"); }
 
int main(){
  setvbuf(stdout,NULL,_IONBF,0);
 
  struct termios old_termios, new_termios;
  tcgetattr(0,&old_termios);
 
  signal( SIGINT, sig_hnd );
 
  new_termios             = old_termios;
  new_termios.c_cc[VEOF]  = 3; // ^C
  new_termios.c_cc[VINTR] = 4; // ^D
  tcsetattr(0,TCSANOW,&new_termios);
 
  char line[256]; int len;
  do{
    len=read(0,line,256); line[len]='\0';
    if( len <0 ) printf("(len: %i)",len);
    if( len==0 ) printf("(VEOF)");
    if( len >0 ){
      if( line[len-1] == 10 ) printf("(line:'%.*s')\n",len-1,line);
      if( line[len-1] != 10 ) printf("(partial line:'%s')",line);
    }
  }while( line[0] != 'q' );
 
  tcsetattr(0,TCSANOW,&old_termios);
}
вот что говорит автор кода:
The program change the VEOF char (from Ctrl-D) to Ctrl-C and the VINTR char (from Ctrl-C) to Ctrl-D. If You press Ctrl-D then the terminal driver will send a SIGINT to the signal handler of the program.

Note: pressing VINTR will erase the terminal input buffer so You can not read the characters typed in the line before the VINTR key pressed.
конечно это кослыть, обмотаный изолентой и кровавыми бинтами, но если очень надо...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2012, 18:03
Привет! Вот еще темы с ответами:

Выход из цикла после нажатия определенной клавиши - C++
Здравствуйте, собственно, хотел узнать, как мне выйти из цикла, нажав определенную клавишу? Обычный цикл по заполнению массива

Остановка потока по нажатию клавиши - C++
Проблема такая: я создал 2 потока, в одном работает счетчик, в другом выводит значение. Нужно по нажатию клавиши пробел остановить оба...

Действие по нажатию клавиши (не работает) - C++
по идее - если нажать w ,то круг сдвинется вправо,а если s,то влево,но он не сдвигается вообще. Если удрать проверку нажатия s,то всё...

Как сделать выход по нажатию клавиш - из графического и консольного режима? - C++
Делаю программу, в которой есть меню и есть графики, которые могут выводиться в зависимости от меню. Требуется сделать так, чтобы график...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru