在objective-C中将控制+ c(SIGINT)发送到NSPIPE

时间:2010-04-26 11:50:18

标签: objective-c nstask sigint control-c

我正在尝试终止通过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密码。

1 个答案:

答案 0 :(得分:3)

Control-C和SIGINT不是一回事。

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

当你有一个管道到另一个进程时,没有涉及tty驱动程序*,所以control-C只是作为普通数据传递。

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

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