簡體   English   中英

我看不到NSTask的輸出-Objective-C JAVA

[英]I can't see the output of NSTask - objective-c JAVA

這是我的代碼:

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]];
}

但是,outputString不返回任何內容,並且陷入了while循環中。 這是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

您可以嘗試僅使用一個調用以下命令的NSTask處理server.sh輸出:sh -c'source server.sh | sed“ / Jarvis> / q”'(參見shstring)。 在此簡化的代碼示例中,server.sh(shfile)僅包含一個cat(1)命令,用於將test.file的內容寫入stdout。 也許您也可以將從Objective-C調用的java命令也添加到shstring中?

#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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM