プロセスをフォークすると特定のコード行が使い果たされるようです-Objective-C
-
08-07-2019 - |
質問
ここに私のコードの簡略版があります:
- (IBAction)convert:(id)sender
{
/* these two lines are ignored */
[textbox setStringValue:@"converting"];
[convertButton setEnabled:NO];
pid_t pid;
if((pid=fork())==-1)
{
[log setStringValue:@"couldn't fork a new process."];
converting = 0;
[convertButton setEnabled:YES];
return;
}else if (pid==0)
{
//this is the child
sleep(2);
exit(0);
}else{
int status;
waitpid(pid,&status,0);
}
}
}
これは非常に基本的なfork()呼び出しです。問題は、最上部の2行(コメント付き)が無視されることです...フォークされた子が終了する後まで実行されないようです。なぜですか?
編集:それを修正するにはどうすればよいですか?
解決
本当に本当に 本当に Cocoaアプリケーションで fork()
を呼び出したくないのです。これを行うと、無数の異なる問題が発生します。これは、主に fork()
の境界を越えてマッハポートやその他のシステムバインディングインフラストラクチャなどのさまざまなリソースがどのように存続するかに関連しています。スレッドはあらゆる種類の地獄も引き起こします。
代わりに NSTask
を使用します。内部的には fork()
/ exec()
を効果的に実行しますが、正しく実行されるように十分注意して実行します。
他のヒント
おそらく、GUIが状態を変更する前に、コードがメインイベントループに戻る必要があるからでしょうか?または、コードがカーネルレベルのwait()を実行している間、GUIを実行するスレッドがブロックされるため、わずかなバリエーションがありますか?
bbumはこれを正確に取得しました。私が最終的に使用したコードは次のとおりです。
- (IBAction)convert:(id)sender
{
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/local/bin/lame"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: file,outputFile, nil];
[task setArguments: arguments];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskFinished:) name:NSTaskDidTerminateNotification object:task];
[task launch];
}
- (void) taskFinished:(NSNotification *)note {
// code here executes after process finishes
}
所属していません StackOverflow