我有一个正在执行我编写的另一个程序的NSTask。在该命令行程序中,它期望ETX(control-C或ASCII值3)暂停其中一个进程并调用另一个函数。我怎么发这个?我知道我正在正确发送命令,因为程序与我发送到目前为止的每个命令都有交互,除了ETX。我正在使用以下代码,但它不起作用:
NSString *cmdScan = [NSString stringWithFormat:@"%c", 3];
[inputHandle writeData: [cmdScan dataUsingEncoding:NSUTF8StringEncoding]];
答案 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);