新しいプロセスをバックグラウンドで実行しようとしているので、親プロセスでの作業を続行できます。
フォークを使用してからexeclを使用しました。execlコマンドに引数&を追加しようとしましたが、機能しません:
execl("newproc","newproc","arg1","&",NULL);
解決策はありますか?
新しいプロセスをバックグラウンドで実行しようとしているので、親プロセスでの作業を続行できます。
フォークを使用してからexeclを使用しました。execlコマンドに引数&を追加しようとしましたが、機能しません:
execl("newproc","newproc","arg1","&",NULL);
解決策はありますか?
を使用したため、子はバックグラウンドで実行されfork
ます。子は親と並行して実行を続けます(exec
成功した場合)。子プロセスが成功したかどうか(そしてコードが成功したかどうか)が気になる場合は、最終的に呼び出しwaitpid
て終了ステータスを収集する必要があります。それ以外の場合は、 fork
2回wait
呼び出して、子を取得せずに中間プロセスを終了する必要があります。これによりinit
、孫プロセスが採用されます。
@mahが言ったように、&
は不要です。しかし、その行には別の変更が必要です。execl
は可変個引数関数であるため、関数プロトタイプは引数を正しい型に変換しません。したがって、最後の引数は正しい型として渡す必要があります。これをに変更するだけ(char*)NULL
です。
あなたはあなたのコードが機能しなかったと言います。それは偽物のせいである&
可能性がありますが、最初の議論のせいでもある可能性があります。この関数は指定されたプログラムをexecl
検索しないため、実際に現在のディレクトリにない限り、この呼び出しは戻ります。戻るとき、それは常に問題があることを示します。これを解決する最も簡単な方法は、の代わりにを使用することです。別のアプローチは、最初の引数として絶対パスを指定することです。最初の引数として相対パスを指定することもできますが、これが役立つことはめったにありません。$PATH
newproc
execl()
execl
execlp()
execl()
&
はコマンド引数ではなく、シェルがバックグラウンドでコマンドを実行することを知るために使用するフラグです。この場合、シェルの作業を実行しています...を削除し&
ます。呼び出したと述べているので、forkが戻った後、子プロセスでfork()
のみ実行している限り、すでにバックグラウンドで実行されています。execl()
問題は、それ&
がプログラムのコマンドラインオプションではないということです。代わりに、コマンドをバックグラウンドに置くのは単なる特別なシェル構文です。バックグラウンドプログラムの際立った特徴は、それらが端末に接続されておらず、端末がプロセスの完了を待機していないことです。適切な関数はdaemon()
です。man daemon
それがどのように使用されているかを読むためにを行ってください。