Отправка control+c (SIGINT) в NSPIPE в объективе-C
Я пытаюсь завершить задачу openvpn, созданную с помощью NSTask.
Мой вопрос:
Должен ли я отправить Ctrl+C (SIGINT) на вход NSPipe для моего NSTask?
inputPipe = [NSPipe pipe];
taskInput = [inputPipe fileHandleForWriting];
NSString dataString = @"\cC";
[taskInput writeData:[dataString dataUsingEncoding: [NSString defaultCStringEncoding]]];
В качестве альтернативы я думал об использовании kill( pid, SIGINT); но это было бы намного сложнее, так как идентификатор процесса должен быть определен с помощью обходного пути ([task processIdentifier] здесь не помогает) - оригинальные вызовы NSTask:
/bin/bash -c sudo -S | mypassword ....
Это не хорошо, я знаю, но он вызывается только один раз, и в этом случае уже был введен пароль sudo.
1 ответ
Control-C и SIGINT - это не одно и то же.
В случае ввода с клавиатуры в ОС есть "драйвер tty", который выполняет эхом символы, обрабатывает delete
ключи и пр. Это также вещь, которая распознает Control-C (или что-то еще intr
символ) и отправляет SIGINT в процесс.
Когда у вас есть канал к другому процессу, tty драйвер не задействуется *, поэтому control-C просто передается как обычные данные.
Вам нужно будет найти PID и отправить SIGINT непосредственно к нему. Конечно, у вас могут не быть разрешения на отправку ему сигнала (потому что вы использовали sudo для запуска другой задачи от имени root)....
* если вы не используете псевдотерминал (pty), чего нет в NSPipe, и вы все равно не хотите этого делать:-)