2016-12-06 9 views
0

私は教授のコードを見て、実装する方法のアイデアを教えてくれました> <、| UNIXシェルへのサポート。私は彼のコードを実行し、実際に起こったことに驚いた。execlpはどのように正確に動作しますか?

if(pid == 0) 
{ 
    close(1);         // close 
    fd = creat("userlist", 0644);    // then open 
    execlp("who", "who", NULL);    // and run 
    perror("execlp"); 
    exit(1); 
} 

これは、私が現在行っていたディレクトリにuserlistファイルを作成し、そのファイル内に "who"データを作成しました。私はfdとexeclpとの間の接続がどこで行われているのかわかりません。 execlpはどのように情報をユーザリストに入れるのですか? execlpはユーザーリストがどのように存在しているかを知っていましたか?

答えて

0

Advanced Linux Programmingを読んでください。この問題に関連する章がいくつかあります。そして、我々はこれをいくつかの文章で説明することはできません。 standard streamおよびprocessウィキペディアも参照してください。

まず、すべてのsystem calls(リストについてsyscalls(2)を見て、あなたが使用しているすべての個々のシステムコールのドキュメントを読む)あなたのプログラムがやっているが、障害に対してテストする必要があります。しかし、彼らはすべて成功すると仮定します。 close(1);の後にfile descriptor 1(STDOUT_FILENO)は無料です。だからcreat("userlist",0644)はそれを再利用する可能性が高いので、fdは1です。 stdoutを改行で作成したuserlistファイルにリダイレクトしました。

最後にexeclp(3)と呼んでおり、execve(2)が呼び出されます。正常に終了すると、プロセス全体が新しい実行可能ファイルで再起動されます(したがって、新鮮なvirtual address spaceが与えられます)。標準出力は依然としてuserlistファイル記述子です。特に(execveが失敗しない限り)perrorコールはには届かず、に達していません。

あなたのコードは、実行中のシェルのビットです。who > userlistは実行中です。 stdoutuserlistのリダイレクションを実行し、whoコマンドを実行します。

シェルをコーディングする場合は、strace(1)(可能であれば-fオプション)を使用して、実行されているシステムコールを理解してください。また、シェルの動作を調べるにはstrace -f /bin/sh -c lsを試してください。既存のfree softwareシェルのソースコードも調べてください(例:bashsash)。

thisも参照してください。

0

execlp知られていません。実行する前にstdoutがクローズされ、ファイルがオープンされたので、記述子はstdoutに対応するものになります(opensは常に最低フリーの記述子を返します)。その時点で、プロセスにはファイルにプラグインされた「stdout」があります。 execが呼び出され、これがアドレス空間全体に置き換えられますが、いくつかのプロパティは記述子のままです。したがって、whoのコードがファイルに対応するstdoutで実行されることがわかります。これはリダイレクトがシェルによって管理される方法です。

たとえば、printfを使用すると、正確にはどのようなstdoutが指定されているのかを忘れないでください。ファイル、端末などがあります。

関連する問題