#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);