4 Stimmen

ETX an die NSTask senden

Ich habe eine NSTask, die ein anderes von mir geschriebenes Programm ausführt. In diesem Kommandozeilenprogramm erwartet es, dass das ETX (Control-C oder ASCII-Wert 3) einen seiner Prozesse anhält und eine andere Funktion aufruft. Wie kann ich das senden? Ich weiß, dass ich die Befehle korrekt sende, da das Programm mit jedem Befehl, den ich ihm bisher gesendet habe, interagiert, außer mit ETX. Ich verwende den folgenden Code, aber er funktioniert nicht:

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

6voto

zneak Punkte 129366

(Ich gehe davon aus, dass Sie das Verhalten der Tastenkombination ctrl+c in einem Terminalfenster emulieren wollen. Wenn Sie wirklich meinen, ein ETX an den Zielprozess zu senden, wird Ihnen diese Antwort nicht weiterhelfen).

Die Tastenkombination ctrl+c sendet kein ETX an die Standardeingabe des Programms. Dies lässt sich leicht überprüfen, da reguläre Tastatureingaben von einem laufenden Programm ignoriert werden können, während ctrl+c (normalerweise) sofort wirksam wird. So können auch Programme, die die Standardeingabe komplett ignorieren (wie z.B. int main() { while (1); } ) kann durch Drücken von ctrl+c beendet werden.

Das funktioniert, weil Terminals die Tastenkombination ctrl+c abfangen und eine SIGINT Signal an den Prozess zu senden. Daher hat das Schreiben eines ETX an die Standardeingabe eines Programms keine Wirkung, da der Tastendruck vom Terminal abgefangen und das resultierende Zeichen nicht an die Standardeingabe des laufenden Programms geliefert wird.

Sie können senden SIGINT Signale an Prozesse, die durch eine NSTask durch die Verwendung der -[NSTask interrupt] Methode.

[task interrupt];

Ansonsten können Sie auch beliebige Signale an Prozesse senden, indem Sie die kill Funktion (die, wohlgemerkt, nicht unbedingt Programme tötet).

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X