1

カスタム アプリと既製のプログラムの間で IPC を設定する方法を見つけようとしています。
MacOSX Lion 10.7.2 と Xcode 4.2.1 を使用しています。

同様の推論があらゆる種類の外部プロセスに適用される可能性があると私は信じているので、正確にどのプログラムであるかは問題ではありません。
テスト目的で、単純な bash スクリプトを使用しています。

#test.sh
echo "Starting"
while read out 
do 
    echo $out
done

私が達成したいのは、このスクリプトの入力と出力をリダイレクトし、アプリを使用して入力を送信し、その出力を読み取ることです。

を使用しようとしましたが、NSTask次のとおりです。NSPipeNSFileHandle

-(void)awakeFromNib {

    task = [[NSTask alloc] init];

    readPipe = [NSPipe pipe];
    writePipe = [NSPipe pipe];

    [task setStandardOutput:readPipe];
    [task setStandardInput:writePipe];    

    [task setLaunchPath:@"/path/test.sh"];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(read:)
                                                 name:NSFileHandleReadCompletionNotification
                                               object:nil];

    [[readPipe fileHandleForReading] readInBackgroundAndNotify];

    [task launch];

}

-(IBAction)write:(id)sender {

    NSLog(@"Write called: %d %@\n",[task isRunning],writePipe);

    NSFileHandle *writeHandle = [writePipe fileHandleForWriting];

    NSString *message = @"someString";

    [writeHandle writeData:[message dataUsingEncoding:NSUTF8StringEncoding] ];

}

-(void)read:(NSNotification*)notification {

    NSString *output = [[NSString alloc] initWithData:[[notification userInfo] valueForKey: NSFileHandleNotificationDataItem]
                                             encoding:NSUTF8StringEncoding];

    NSLog(@"%@",output);

    [output release];

    [[notification object] readInBackgroundAndNotify]; 

}

test.shしかし、入力を送信することはできず、出力を読み取ることしかできません。

実際、ウェブで見た他の例は私のコードにかなり似ているため、この問題が私の間違いによるものなのか、それとも他の問題 (アプリの MacOS Lion のサンドボックス化など) によるものなのかはわかりません。

XPC のドキュメントを確認しましたが、調査によると、XPC API を IPC に使用するには、両側が同じサービスに接続する必要があります。
スクリプトを変更したくないので、それは私が探しているものではありません。入力と出力をリダイレクトしたいだけです。

私の問題は、XPC の欠如やアプリのサンドボックス化が原因ですか?

はいの場合、スクリプトを変更せずに XPC を使用する方法はありますか?
いいえの場合、誰かが私が間違っていることを説明してもらえますか?

4

1 に答える 1

1

これには XPC は必要ありません。違いはありません。

コマンドラインで何かをパイプすると、スクリプト/外部プロセスは入力を読み取ることができますか

% echo "foobar" | /path/test.sh

?

どのくらいのデータを送信していますか。書き込みはバッファリングされます。IIRC-synchronizeFileはバッファをフラッシュします - と同じfsync(2)です。

于 2012-03-27T12:50:45.487 に答える