Отправка 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, и вы все равно не хотите этого делать:-)

Другие вопросы по тегам