Domanda

Ecco il mio codice:

NSTask *setupTask = [NSTask new];
[setupTask setLaunchPath:@"/bin/sh"];
[setupTask setArguments:[NSArray arrayWithObject:@"/applications/jarvis/brain/server.sh"]];
[setupTask setCurrentDirectoryPath:@"/"];
NSPipe *outputPipeSetup = [NSPipe pipe];
[setupTask setStandardInput:[NSPipe pipe]];
[setupTask setStandardOutput:outputPipeSetup];
[setupTask launch];

NSTask *aliceTask = [NSTask new];
[aliceTask setLaunchPath:@"/usr/bin/java"];
[aliceTask setArguments:[NSArray arrayWithObjects:@"-classpath", @"/applications/jarvis/brain/", @"-Xms64m", @"-Xmx128m", @"org.alicebot.server.net.AliceServer", nil]];

 NSPipe *aliceInputPipe = [NSPipe pipe];
 [aliceTask setStandardInput:aliceInputPipe];
 NSPipe *aliceOutputPipe = [NSPipe pipe];
 [aliceTask setStandardOutput:aliceOutputPipe];

 [aliceTask launch];

NSMutableString *outputString = [NSMutableString string];
while ([outputString rangeOfString:@"Jarvis>"].location == NSNotFound) {
    [outputString appendString:[[[NSString alloc] initWithData:[[aliceOutputPipe fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding] autorelease]];
}

MA, OutputString restituisce nulla e ottenere di bloccato nel ciclo while. Ecco il file server.sh:

echo Starting Jarvis Program D.
ALICE_HOME=.
SERVLET_LIB=lib/servlet.jar
ALICE_LIB=lib/aliceserver.jar
JS_LIB=lib/js.jar

# Set SQL_LIB to the location of your database driver.
SQL_LIB=lib/mysql_comp.jar

# These are for Jetty; you will want to change these if you are using a different http server.
 HTTP_SERVER_LIBS=lib/org.mortbay.jetty.jar

 PROGRAMD_CLASSPATH=$SERVLET_LIB:$ALICE_LIB:$JS_LIB:$SQL_LIB:$HTTP_SERVER_LIBS
 java -classpath $PROGRAMD_CLASSPATH -Xms64m -Xmx128m org.alicebot.server.net.AliceServer $1
È stato utile?

Soluzione

Si può tentare di elaborare l'uscita server.sh utilizzando un solo NSTask che le chiamate: sh -c 'fonte server.sh | sed "/ Jarvis> / q"'(cfr shstring). In questo esempio semplificato codice server.sh (shfile) contiene solo un singolo comando cat (1) per scrivere il contenuto del test.file stdout. Forse si può semplicemente aggiungere il comando java che viene chiamato da Objective-C per shstring così?

#import <Foundation/Foundation.h>

/*

See:
http://stackoverflow.com/questions/3505942/i-cant-see-the-output-of-nstask-objective-c-java

compile with:
gcc -Wall -O3 -x objective-c -fobjc-exceptions -framework Foundation -o test test.c

./test

# create test.file
n=50
jot -b 'line' $n | nl -w 10 > test.file
echo "Jarvis>" | nl -w 10 -v $((n+1)) >> test.file
jot -b 'line' 19 | nl -w 10 -v $((n+2)) >> test.file

ls -lh test.file
tail -n 100 test.file

# create server.sh
echo '
cat test.file
' > server.sh

sh server.sh

./test

*/


int main(int argc, const char *argv[])
{

    NSAutoreleasePool *pool =  [[NSAutoreleasePool alloc] init];
    NSString *shfile = @"server.sh";

    NSString *shstring = [NSString stringWithFormat:
             @"%@ %@ %@", 
             @"source", 
             shfile, 
             @"| /usr/bin/sed '/Jarvis>/q'"
    ];

    NSTask *sh = [NSTask new];
    NSPipe *pipe = [NSPipe new];
    [sh setLaunchPath:@"/bin/sh"];
    [sh setArguments:[NSArray arrayWithObjects: @"-c", shstring, nil ]];
    [sh setCurrentDirectoryPath:@"."];
    //[sh setStandardInput:[NSFileHandle fileHandleWithNullDevice]];
    [sh setStandardError:[NSFileHandle fileHandleWithNullDevice]];
    [sh setStandardOutput:pipe];
    [sh launch];

    NSData *data = [[[sh standardOutput] fileHandleForReading] readDataToEndOfFile];
    NSString *string = [[[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding] autorelease];

    NSLog(@"\n\n%@\n", string);

    [pool release];

    return 0;

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top