Отправка ETX в NSTask
У меня есть NSTask, который выполняет другую программу, которую я написал. В этой программе командной строки он ожидает, что ETX (control-C или значение 3 ASCII) приостановит один из своих процессов и вызовет другую функцию. Как я могу отправить это? Я знаю, что отправляю команды правильно, потому что программа взаимодействует с каждой командой, которую я отправлял, кроме 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
сигналы к процессам, представленным NSTask
используя -[NSTask interrupt]
метод.
[task interrupt];
В противном случае вы также можете отправлять произвольные сигналы процессам, используя kill
функция (которая, имейте в виду, не обязательно убивает программы).
#include <signal.h>
kill(task.processIdentifier, SIGINT);