3

我正在尝试终止通过 NSTask 生成的 openvpn 任务。

我的问题:

我应该将ctrl+ c(SIGINT) 发送到我的 NSTask 的输入 NSPipe 吗?

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 不是一回事。

在键盘输入的情况下,操作系统中有一个“tty 驱动程序”,它执行诸如回显字符、处理delete键等操作。它也是识别 control-C(或任何你的intr角色)并向进程发送 SIGINT 的东西。

当您有通往另一个进程的管道时,不涉及 tty 驱动程序*,因此 control-C 只是作为普通数据传递。

您需要找到 pid 并直接向其发送 SIGINT。当然,您实际上可能没有权限向它发送信号(因为您使用 sudo 以 root 身份运行其他任务)....

*除非您使用的是伪终端(pty),而 NSPipe 没有,而且您也不想这样做 :-)

于 2010-04-26T12:25:04.130 回答