Отправка ETX в NSTask - PullRequest
       15

Отправка ETX в NSTask

3 голосов
/ 15 октября 2011

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

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

1 Ответ

6 голосов
/ 15 октября 2011

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

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

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

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

[task interrupt];

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

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