Вопрос:

Связь между процессами с использованием NSPipe, NSTask

objective-c ipc nstask nspipe

1868 просмотра

1 ответ

555 Репутация автора

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

[task setCurrentDirectoryPath:@"....."];
[task setArguments:];

Мне просто нужно написать некоторые данные

NSString * message = @"Hello World";
[stdinHandle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];

и в другой теме, чтобы получить это сообщение

NSData *stdOutData = [reader availableData];
NSString * message = [NSString stringWithUTF8String:[stdOutData bytes]]; //My Hello World

Например, такие вещи в C # можно легко сделать с помощью классов NamedPipeClientStream, NamedPipeServerStream, где каналы регистрируются по строке идентификатора.

Как этого добиться в Objective-C?

Автор: Andrew Источник Размещён: 19.12.2012 09:46

Ответы (1)


3 плюса

418704 Репутация автора

Решение

Если я правильно понимаю ваш вопрос, вы можете просто создать NSPipeи использовать один конец для чтения и один конец для письма. Пример:

// Thread function is called with reading end as argument:
- (void) threadFunc:(NSFileHandle *)reader
{
    NSData *data = [reader availableData];
    NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", message);
}

- (void) test
{
    // Create pipe:
    NSPipe *pipe = [[NSPipe alloc] init];
    NSFileHandle *reader = [pipe fileHandleForReading];
    NSFileHandle *writer = [pipe fileHandleForWriting];

    // Create and start thread:
    NSThread *myThread = [[NSThread alloc] initWithTarget:self
                                                 selector:@selector(threadFunc:)
                                                   object:reader];
    [myThread start];

    // Write to the writing end of pipe:
    NSString * message = @"Hello World";
    [writer writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];

    // This is just for this test program, to avoid that the program exits
    // before the other thread has finished.
    [NSThread sleepForTimeInterval:2.0];
}
Автор: Martin R Размещён: 19.12.2012 10:52
Вопросы из категории :
32x32