Связь между процессами с использованием NSPipe,NSTask
Мне нужно реализовать связь между двумя потоками, используя каналы 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, где каналы регистрируются строкой id.
Как этого добиться в Objective-C?
1 ответ
Решение
Если я правильно понимаю ваш вопрос, вы можете просто создать 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];
}