Как обработать сигнал ctrl-break в интерфейсе командной строки

Java может делать почти все, что может curl. Просто скачайте файл с кодом:

URL remotePythonFile = new URL("http://example.com/remotefile.py");
Path localPythonFile = Files.createTempfile(null, ".py");
try (InputStream remoteStream = remotePythonFile.openStream()) {
    Files.copy(remoteStream, localPythonFile,
        StandardCopyOption.REPLACE_EXISTING);
}

ProcessBuilder builder =
    new ProcessBuilder("python", localPythonFile.toString());
5
задан Miquella 8 October 2008 в 06:19
поделиться

4 ответа

Хорошо - это работает на меня в Windows и портативно - замечают #ifdef SIGBREAK - это не стандартный сигнал.

#include <csignal>
#include <iostream>
#include <ostream>
#include <string>
using namespace std;

namespace
{
    volatile sig_atomic_t quit;

    void signal_handler(int sig)
    {
        signal(sig, signal_handler);
        quit = 1;
    }
}

int main()
{
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);
#ifdef SIGBREAK
    signal(SIGBREAK, signal_handler);
#endif
    /* etc */

    while (!quit)
    {
        string s;
        cin >> s;
        cout << s << endl;
    }
    cout << "quit = " << quit << endl;
}
8
ответ дан 18 December 2019 в 09:55
поделиться

На *отклоняют базирующуюся систему, Вам, возможно, не действительно понадобился бы обработчик сигналов для этого для работы. Вы могли указать, что хотите проигнорировать вызов SIGINT

int main(void)
{
  // Register to ignore the SIGINT signal (Ctrl+C)
  signal(SIGINT, SIG_IGN);

  while(1)
  {
    retval = my_blocking_io_func();
    if(retval == -1 && errno == EINTR)
    {
      // do whatever you want to do in case of interrupt
    }
  }
}

Важный способ, которым это работает, состоит в том, чтобы распознать, что неблокирующиеся функции действительно становятся прерванными. Обычно, Вы поняли бы, что блокирующаяся неудавшаяся функция (например, читают ()) и повторно делает попытку функции. Если бы это было некоторое другое значение, то Вы приняли бы соответствующие связанные с ошибкой меры.

1
ответ дан 18 December 2019 в 09:55
поделиться

В Windows: SetConsoleCtrlHandler

2
ответ дан 18 December 2019 в 09:55
поделиться

На *отклоняют, можно использовать signal функционируйте для регистрации обработчика сигналов:


#include <signal.h>

void signal_handler(int sig)
{
  // Handle the signal
}

int main(void)
{
  // Register the signal handler for the SIGINT signal (Ctrl+C)
  signal(SIGINT, signal_handler);
  ...
}

Теперь, каждый раз, когда кто-то поражает Ctrl+C, Ваш обработчик сигналов назовут.

6
ответ дан 18 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: