Отправка control + c (SIGINT) в NSPIPE в объективе-C - PullRequest
3 голосов
/ 26 апреля 2010

Я пытаюсь завершить задачу 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 Ответ

3 голосов
/ 26 апреля 2010

Control-C и SIGINT - это не одно и то же.

В случае ввода с клавиатуры в ОС есть «драйвер tty», который выполняет эхо-символы, обрабатывает клавиши delete и т. Д. Это также то, что распознает control-C (или каков ваш символ intr) и отправляет процесс SIGINT.

Когда у вас есть канал к другому процессу, драйвер tty не задействуется *, поэтому control-C просто передается как обычные данные.

Вам нужно будет найти пид и отправить SIGINT прямо на него. Конечно, у вас могут не быть разрешения на отправку ему сигнала (потому что вы использовали sudo для запуска другой задачи от имени root) ....

*, если вы не используете псевдотерминал (pty), чего нет у NSPipe, и вы все равно не хотите: -)

...