1

私はそれが働いています。ただし、最初は入力を待っているように見えます。停止して入力を待機する前に、出力されたものを読み取るにはどうすればよいですか?

task starts
stdout should post data for "sftp> " but nothing happens, its waiting for input
If I write "\n" to stdin
stdout notifies me of data available which ends up being "sftp> \n"

実装方法は次のとおりです。

[self.task = [[NSTask alloc] init];
[self.task setLaunchPath:executablePath];
[self.task setArguments: args];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(terminatedNotification:) name:NSTaskDidTerminateNotification object:self.task];

//reading
self.stdoutPipe = [NSPipe pipe];
self.task.standardOutput = self.stdoutPipe;
[self.stdoutPipe.fileHandleForReading waitForDataInBackgroundAndNotify];

//error
self.stderrorPipe = [NSPipe pipe];
self.task.standardError = self.stderrorPipe;
[self.stderrorPipe.fileHandleForReading waitForDataInBackgroundAndNotify];

/*
reading works perfect until I uncomment this section
//writing
self.stdinPipe = [NSPipe pipe];
self.task.standardInput = self.stdinPipe;
*/

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataAvailable:) name:NSFileHandleDataAvailableNotification object:self.stdoutPipe.fileHandleForReading];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataAvailable:) name:NSFileHandleDataAvailableNotification object:self.stderrorPipe.fileHandleForReading];
4

1 に答える 1

3

NSFileHandle に書き込まれたデータはバッファリングされます。バッファがフラッシュされた後でのみ、パイプの反対側で読み取ることができます。次の場合、バッファはフラッシュされます。

  1. いっぱいで、これ以上データが入りません。
  2. 改行文字 ("\n") が書き込まれます (autoflush)。
  3. 呼び出して明示的にフラッシュします- (void)synchronizeFile
于 2013-01-19T01:19:15.843 に答える