将ETX发送到NSTask

时间:2011-10-15 06:34:26

标签: cocoa nstask

我有一个正在执行我编写的另一个程序的NSTask。在该命令行程序中,它期望ETX(control-C或ASCII值3)暂停其中一个进程并调用另一个函数。我怎么发这个?我知道我正在正确发送命令,因为程序与我发送到目前为止的每个命令都有交互,除了ETX。我正在使用以下代码,但它不起作用:

NSString *cmdScan = [NSString stringWithFormat:@"%c", 3];
[inputHandle writeData: [cmdScan dataUsingEncoding:NSUTF8StringEncoding]];

1 个答案:

答案 0 :(得分:6)

(我假设你想模仿终端窗口中ctrl + c键击的行为。如果真的意味着将ETX发送到目标进程,那么这个答案不是会帮助你。)

ctrl + c键盘组合不会将ETX发送到程序的标准输入。这很容易验证,因为正常的键盘输入可以被正在运行的程序忽略,但ctrl + c(通常)会立即生效。例如,即使完全忽略标准输入的程序(例如int main() { while (1); })也可以通过按ctrl + c来停止。

这是有效的,因为终端捕获ctrl + c组合键并向进程发送SIGINT信号。因此,将ETX写入程序的标准输入无效,因为终止捕获了击键,并且结果字符未传送到正在运行的程序的标准输入。

您可以使用SIGINT方法将NSTask信号发送到-[NSTask interrupt]代表的流程。

[task interrupt];

否则,您还可以使用kill函数向进程发送任意信号(请注意,不一定会杀死程序)。

#include <signal.h>
kill(task.processIdentifier, SIGINT);