0

新しいプロセスをバックグラウンドで実行しようとしているので、親プロセスでの作業を続行できます。

フォークを使用してからexeclを使用しました。execlコマンドに引数&を追加しようとしましたが、機能しません:

execl("newproc","newproc","arg1","&",NULL);

解決策はありますか?

4

3 に答える 3

4

を使用したため、子はバックグラウンドで実行されforkます。子は親と並行して実行を続けます(exec成功した場合)。子プロセスが成功したかどうか(そしてコードが成功したかどうか)が気になる場合は、最終的に呼び出しwaitpidて終了ステータスを収集する必要があります。それ以外の場合は、 fork 2回wait呼び出して、子を取得せずに中間プロセスを終了する必要があります。これによりinit、孫プロセスが採用されます。

@mahが言ったように、&は不要です。しかし、その行には別の変更が必要です。execlは可変個引数関数であるため、関数プロトタイプは引数を正しい型に変換しません。したがって、最後の引数は正しい型として渡す必要があります。これをに変更するだけ(char*)NULLです。

あなたはあなたのコードが機能しなかったと言います。それは偽物のせいである&可能性がありますが、最初の議論のせいでもある可能性があります。この関数は指定されたプログラムをexecl検索しないため、実際に現在のディレクトリにない限り、この呼び出しは戻ります。戻るとき、それは常に問題があることを示します。これを解決する最も簡単な方法は、の代わりにを使用することです。別のアプローチは、最初の引数として絶対パスを指定することです。最初の引数として相対パスを指定することもできますが、これが役立つことはめったにありません。$PATHnewprocexecl()execlexeclp()execl()

于 2012-06-10T21:19:41.680 に答える
2

&はコマンド引数ではなく、シェルがバックグラウンドでコマンドを実行することを知るために使用するフラグです。この場合、シェルの作業を実行しています...を削除し&ます。呼び出したと述べているので、forkが戻った後、子プロセスでfork()のみ実行している限り、すでにバックグラウンドで実行されています。execl()

于 2012-06-10T21:06:08.427 に答える
2

問題は、それ&がプログラムのコマンドラインオプションではないということです。代わりに、コマンドをバックグラウンドに置くのは単なる特別なシェル構文です。バックグラウンドプログラムの際立った特徴は、それらが端末に接続されておらず、端末がプロセスの完了を待機していないことです。適切な関数はdaemon()です。man daemonそれがどのように使用されているかを読むためにを行ってください。

于 2012-06-10T21:06:16.463 に答える