4

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

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

1 回答 1

6

(我假设您想在终端窗口中模拟 ctrl+c 击键的行为。如果您真的想将 ETX 发送到目标进程,那么这个答案对您没有帮助。)

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

这是有效的,因为终端会捕获 ctrl+c 组合键并将SIGINT信号传递给进程。因此,将 ETX 写入程序的标准输入没有任何效果,因为按键被终端捕获,并且生成的字符不会传递到正在运行的程序的标准输入。

您可以使用该方法SIGINT向由 a 表示的进程发送信号。NSTask-[NSTask interrupt]

[task interrupt];

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

#include <signal.h>
kill(task.processIdentifier, SIGINT);
于 2011-10-15T06:41:38.023 回答