Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проблема с Ctrl-c


Автор: jecl 28.1.2010, 20:51
Всем привет.
Есть проект xCmd - выполнение команд на удаленной вин машине.
http://www.google.com/codesearch/p?hl=ru#sSLuyk11fLo/archives/fulldisclosure/2004-05/att-0329/xCmd.zip|WobokFQzdp8/xCmd/xCmd.h&q=xcmd

Как работает
При запуске xCmd происходит логин на удаленную машину с поднятием xCmdSvc - сервиса, который и будет выполнять команды.
Т.е. при выполнении xCmd \\localhost cmd
На удаленной машине запускается cmd.exe, весь отпут форвардится к нам, весь инпут - на удаленную машину.
Реализовано с помощью пайпов. Т.е. xCmdSvc открывает три пайпа на err, in, out(создается процесс с этими пайпами, тот самый cmd.exe). xCmd коннектится к пайпам и непосредственно общается с процессом запущенным xCmdSvc.

Все неплохо, есть одно но. При отправке ctrlc на in pipe ничего не происходит. текущая команда выполняемая в cmd(ping localhost к примеру) не прерывается. Если же отослать ctrlc ничего не делающему cmd, а затем нажать enter выводится символ сердечка:(

Решил сделать эксперимент в виде такого кода:
Код

#include <windows.h>
#include <iostream.h>
#include <string>
#include <conio.h>

BOOL WINAPI xCmdConsoleCtrlHandler( DWORD dwCtrlType )
{
   switch( dwCtrlType )
   {
   case CTRL_C_EVENT:
   case CTRL_BREAK_EVENT:
       std::cout << "Got Ctrl-C event!"<< std::endl;
       exit(0);
      break;
   }

   return TRUE;
}

int main ( void )
{
    std::string word = "";
    SetConsoleCtrlHandler( xCmdConsoleCtrlHandler, TRUE );
    while(word != "exit"){
        char ch = _getche();
        if(ch == 3){
            HANDLE stdInput = GetStdHandle(STD_INPUT_HANDLE);
            byte ctrlC[] = {(byte)0x003};
            DWORD nBytesWrote;
            WriteFile( stdInput, ctrlC, sizeof ctrlC, &nBytesWrote, NULL );
            continue;
        }

        std::cout << "Typed: " << ch << std::endl;

    }

  return 0;
}



Так вот при нажатии ctrlс ничего не происходит(кроме вывода сердечек).
Почему?


Автор: jonie 29.1.2010, 12:38
Цитата

byte ctrlC[] = {(byte)0x003};
а откуда это магическое число  ?
Ctrl+C не генерирует 3, т.е. может оно так и приходит куда-то там, но помимо 3-ки есть и еще вещи, которые делает Ctrl+C ....

Автор: jecl 29.1.2010, 13:00
Никакой магии
ctrl-C, он же ETX = 03
http://nemesis.lonestar.org/reference/telecom/codes/ascii.html
Цитата

Ctrl+C не генерирует 3, т.е. может оно так и приходит куда-то там, но помимо 3-ки есть и еще вещи, которые делает Ctrl+C 

Тогда вопрос в том что помимо отсылки тройки надо еще сделать?

Т.е. изначальная задача по имеющемуся пайпу (пайп представляет собой стдИн)передать Ctrl-C.
Данный пример упрощение, но для начала хотелось бы добиться что бы он работал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)