Я пишу простой терминал с помощью openpty
, NSTask и NSTextView. Как предполагается выполнение Ctrl C и Ctrl D?
Я запускаю оболочку следующим образом:
int amaster = 0, aslave = 0;
if (openpty(&amaster, &aslave, NULL, NULL, NULL) == -1) {
NSLog(@"openpty failed");
return;
}
masterHandle = [[NSFileHandle alloc] initWithFileDescriptor:amaster closeOnDealloc:YES];
NSFileHandle *slaveHandle = [[NSFileHandle alloc] initWithFileDescriptor:aslave closeOnDealloc:YES];
NSTask *task = [NSTask new];
task.launchPath = @"/bin/bash";
task.arguments = @[@"-i", @"-l"];
task.standardInput = slaveHandle;
task.standardOutput = slaveHandle;
task.standardError = errorOutputPipe = [NSPipe pipe];
[task launch];
Затем я перехватываю Ctrl C и отправлю -[interrupt]
в NSTask
следующим образом:
- (void)keyDown:(NSEvent *)theEvent
{
NSUInteger flags = theEvent.modifierFlags;
unsigned short keyCode = theEvent.keyCode;
if ((flags & NSControlKeyMask) && keyCode == 8) { // ctrl-c
[task interrupt]; // ???
} else if ((flags & NSControlKeyMask) && keyCode == 2) { // ctrl-d
// ???
} else {
[super keyDown:theEvent];
}
}
Однако прерывание, похоже, не убивает любую программу, выполняемую оболочкой. Если оболочка не имеет подпроцесса, прерывание отменяет текущую строку ввода.
Я не знаю, как реализовать Ctrl D.