Межпроцессное взаимодействие на MacOSX Lion - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь выяснить, как настроить IPC между моим пользовательским приложением и готовой программой.
Я использую MacOSX Lion 10.7.2 и Xcode 4.2.1.

На самом деле не имеет значения, какая именно программа, поскольку я считаю, что аналогичные рассуждения могут применяться к любому внешнему процессу.
Для тестирования я использую простой скрипт bash:

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

Чего я хотел бы добиться, так это перенаправить ввод и вывод этого скрипта, используя мое приложение для отправки ему входных данных и считывания его выходных данных.

Я пытался использовать NSTask, NSPipe и NSFileHandle следующим образом:

-(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 без изменения скрипта?
Если нет, то может кто-нибудь объяснить мне, что я делаю не так?

1 Ответ

1 голос
/ 27 марта 2012

Вам не нужен XPC для этого. Не будет никакой разницы.

Может ли ваш скрипт / внешний процесс читать ввод, когда вы что-то передаете ему в командной строке

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

Сколько данных вы отправляете на него. Запись будет буферизована. IIRC -synchronizeFile очистит буферы - так же, как fsync(2).

...