2012-03-16 3 views
1

사용자 정의 앱과 사전에 만들어진 프로그램간에 IPC를 설정하는 방법을 알아 내려고합니다.
MacOSX Lion 10.7.2 및 Xcode 4.2.1을 사용하고 있습니다.MacOSX Lion의 InterProcess Communication

비슷한 추론이 외부 프로세스의 모든 종류에 적용될 수 있다고 생각하기 때문에 실제로 어떤 프로그램이 정확히 문제가되지 않습니다. 내가 달성하고자하는 어떤

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

그것에 입력을 전송하고 출력을 읽어 내 응용 프로그램을 사용하여,이 스크립트의 입력과 출력을 리디렉션하는 것입니다 테스트 목적으로 내가 간단한 bash는 스크립트를 사용하고 들어
.

-(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의 출력을 읽고 그것을 모든 입력을 보낼뿐만 아니라 수 있어요 :

나는 다음과 같이 NSTask, NSPipeNSFileHandle을 사용했습니다.

실제로 웹에서 본 다른 예는 내 코드와 매우 유사하므로이 문제가 내 실수 또는 다른 문제 (예 : MacOS Lion의 앱 샌드 박싱) 때문인지 확실하지 않습니다.).

필자는 XPC 설명서를 확인했지만, 내 연구에 따르면 IPC에 XPC API를 사용하려면 쪽 모두 동일한 서비스에 연결해야합니다.
그것은 내가 어떤 식 으로든 스크립트를 변경하고 싶지 않기 때문에 찾고자하는 것이 아닙니다. 입력과 출력을 리디렉션하고 싶습니다.

내 문제는 XPC가 없거나 앱의 샌드 박스 때문에 발생합니까?

그렇다면 스크립트를 수정하지 않고 XPC를 사용할 수있는 방법이 있습니까?
아니요, 그렇다면 누군가 내가 잘못하고있는 것을 설명 할 수 있습니까?

답변

1

이렇게하려면 XPC가 필요하지 않습니다. 어떤 차이를 만들지 않을 것입니다.

은 스크립트/외부 프로세스는 입력을 읽을 수있을 때 명령 줄

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

에 그것에 당신 파이프 무엇인가?

얼마나 많은 데이터를 보내고 있습니까? 쓰기가 버퍼링됩니다. IIRC -synchronizeFile은 버퍼를 플러시합니다 (fsync(2)과 동일).

+0

답장을 보내 주셔서 감사합니다. 예, 명령 줄에서 스크립트가 올바르게 작동합니다. 내 프로그램에서 나는 당신이 코드에서 볼 수있는 것처럼''someString ''만을 보내고있다. '[writeHandle synchronizeFile];을 사용하여'[NSConcreteFileHandle synchronizeFile] : Operation not supported'가 발생했습니다. – Saphrosit