사용자 정의 앱과 사전에 만들어진 프로그램간에 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
, NSPipe
및 NSFileHandle
을 사용했습니다.
실제로 웹에서 본 다른 예는 내 코드와 매우 유사하므로이 문제가 내 실수 또는 다른 문제 (예 : MacOS Lion의 앱 샌드 박싱) 때문인지 확실하지 않습니다.).
필자는 XPC 설명서를 확인했지만, 내 연구에 따르면 IPC에 XPC API를 사용하려면 쪽 모두 동일한 서비스에 연결해야합니다.
그것은 내가 어떤 식 으로든 스크립트를 변경하고 싶지 않기 때문에 찾고자하는 것이 아닙니다. 입력과 출력을 리디렉션하고 싶습니다.
내 문제는 XPC가 없거나 앱의 샌드 박스 때문에 발생합니까?
그렇다면 스크립트를 수정하지 않고 XPC를 사용할 수있는 방법이 있습니까?
아니요, 그렇다면 누군가 내가 잘못하고있는 것을 설명 할 수 있습니까?
답장을 보내 주셔서 감사합니다. 예, 명령 줄에서 스크립트가 올바르게 작동합니다. 내 프로그램에서 나는 당신이 코드에서 볼 수있는 것처럼''someString ''만을 보내고있다. '[writeHandle synchronizeFile];을 사용하여'[NSConcreteFileHandle synchronizeFile] : Operation not supported'가 발생했습니다. – Saphrosit