3

NSTask を介して生成された openvpn タスクを終了しようとしています。

私の質問:

NSTask の入力 NSPipe にctrl+ (SIGINT)を送信する必要がありますか?c

inputPipe = [NSPipe pipe]; 
taskInput = [inputPipe fileHandleForWriting];
NSString dataString = @"\cC";
[taskInput writeData:[dataString dataUsingEncoding: [NSString defaultCStringEncoding]]];

または、 kill( pid, SIGINT ); の使用を考えていました。ただし、プロセス ID を迂回して決定する必要があるため ([task processIdentifier] はここでは役に立ちません)、はるかに複雑になります。元の NSTask 呼び出しは次のとおりです。

/bin/bash -c sudo -S | mypassword ....

それは良くありません、私は知っていますが、それは一度だけ呼び出され、その場合は sudo パスワードがすでに入力されています。

4

1 に答える 1

3

Control-C と SIGINT は同じものではありません。

キーボード入力の場合、OS には「tty ドライバー」があり、文字のエコー、deleteキーの処理などを行います。これは、control-C (またはあなたのキャラクターが何であれ) を認識intrし、プロセスに SIGINT を送信するものでもあります。

別のプロセスへのパイプがある場合、tty ドライバーは関与しない*ため、control-C は通常のデータとして渡されます。

pid を見つけて、直接 SIGINT を送信する必要があります。もちろん、実際にはシグナルを送信する権限がない可能性があります (他のタスクを root として実行するために sudo を使用したため)...

*疑似端末 (pty) を使用していない限り、NSPipe は使用せず、とにかくやりたくない場合:-)

于 2010-04-26T12:25:04.130 に答える