Отправка 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);
Другие вопросы по тегам