![](/img/trans.png)
[英]sudo auth session while executing command using NSTask in cocoa application
[英]Keep a NSTask Session Running - Cocoa
我在我的 Cocoa 應用程序中運行一個簡單的 grep 命令,如下所示:
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/grep"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"foo", @"bar.txt", nil];
[task setArguments: arguments];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog (@"grep returned:\n%@", string);
[string release];
[task release];
但是,我有點想知道如何通過終端輸入命令,這些命令不會發出 output 並且不會立即執行,除非使用Control + C之類的東西退出可以使用這種技術運行。 像運行java -jar server.jar
這樣它會一直運行直到退出 session。 一旦命令啟動,session 不會自動結束,我該怎么做?
我只需要注釋掉它發布NSTask
的部分嗎? 任何建議都會很好!
將NSTask
與不會立即退出的底層程序一起使用時:
你不應該使用-[NSFileHandle readDataToEndOfFile]
因為沒有文件結尾。 相反,您應該使用-[NSFileHandle readInBackgroundAndNotify]
在后台讀取該任務的標准 output pipe,並在數據可用時收到通知;
僅當您確定該任務不應再運行時,才應使用-[NSTask release]
。 在這種情況下,在發布任務之前,您應該向其標准輸入發送導致底層程序退出的命令(例如相當於control -d的字符),或者發送它-terminate
或-interrupt
。
除非您已生成輔助線程來處理該任務,否則您不應使用-waitUntilExit
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.