2011-10-15 37 views
3

我有一個NSTask正在執行我寫的另一個程序。在該命令行程序中,它期望ETX(control-C或ASCII值3)暫停其中一個進程並調用另一個函數。我怎樣才能發送這個?我知道我發送的命令是正確的,因爲除了ETX之外,程序與我發送的每個命令都交互。我使用下面的代碼,但它不工作:發送ETX到NSTask

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

回答

6

(我假設你想模仿在終端窗口中按Ctrl + C鍵擊的行爲,如果你真的意味着發送。一個ETX目標進程,這個答案是不會幫你的。)

的CTRL + C組合鍵的ETX不發送到程序的標準輸入。這很容易驗證,因爲常規鍵盤輸入可以被正在運行的程序忽略,但ctrl + c(通常)會立即生效。例如,即使完全忽略標準輸入的程序(如int main() { while (1); })也可以通過按ctrl + c來停止。

這是可行的,因爲終端接收到ctrl + c組合鍵並將SIGINT信號發送給進程。因此,將ETX寫入程序的標準輸入不起作用,因爲按鍵被終端捕獲,並且生成的字符不會傳送到正在運行的程序的標準輸入。

您可以使用-[NSTask interrupt]方法將SIGINT信號發送到由NSTask表示的進程。

[task interrupt]; 

否則,你也可以通過使用kill功能(其中,你要知道,不一定殺死程序)發送任意的信號處理。

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

您的回答幫了我很多,謝謝! –