Отправка ETX в NSTask

#cocoa #nstask

#cocoa #nstask

Вопрос:

У меня есть NSTask, который выполняет другую программу, которую я написал. В этой программе командной строки ожидается, что ETX (control-C или значение ASCII 3) приостановит один из своих процессов и вызовет другую функцию. Как я могу отправить это? Я знаю, что отправляю команды правильно, потому что программа взаимодействует с каждой командой, которую я отправил до сих пор, кроме ETX. Я использую следующий код, но он не работает:

 NSString *cmdScan = [NSString stringWithFormat:@"%c", 3];
[inputHandle writeData: [cmdScan dataUsingEncoding:NSUTF8StringEncoding]];
  

Ответ №1:

(Я предполагаю, что вы хотите эмулировать поведение нажатия клавиш ctrl c в окне терминала. Если вы действительно хотите отправить ETX целевому процессу, этот ответ вам не поможет.)

Комбинация клавиш ctrl c не отправляет ETX на стандартный ввод программы. Это можно легко проверить, поскольку обычный ввод с клавиатуры может игнорироваться запущенной программой, но ctrl c (обычно) немедленно вступает в силу. Например, даже программы, которые полностью игнорируют стандартный ввод (например, int main() { while (1); } ), могут быть остановлены нажатием ctrl c.

Это работает, потому что терминалы перехватывают комбинацию клавиш ctrl c и вместо этого передают SIGINT сигнал процессу. Следовательно, запись ETX в стандартный ввод программы не имеет никакого эффекта, поскольку нажатие клавиши перехватывается терминалом, и результирующий символ не передается на стандартный ввод запущенной программы.

Вы можете отправлять SIGINT сигналы процессам, представленным a NSTask , используя -[NSTask interrupt] метод.

 [task interrupt];
  

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

 #include <signal.h>
kill(task.processIdentifier, SIGINT);