4

これは私が取り組んでいる学校のプロジェクトです。

私はウェブサーバーを書いています。要求されたリソースの拡張子が「cgi」の場合、プログラムをフォークして実行する必要があります。cgiがコンパイル済みの実行可能ファイルである場合、これは機能します。

execl(path, (char*) 0);

しかし、cgiプログラムが解釈する必要のあるスクリプトである場合、私は次のようなことをする必要があります。

execl("/bin/sh", path, path, (char*) 0);

どちらのシナリオでも処理できるようにコードを作成するにはどうすればよいですか?私のシェルはこれをどのように行いますか?プログラムを使用してfile、実行可能ファイルかテキストかを判断し、テキストかどうかを判断する必要がありますか?それから、解釈する必要があると想定しますか?

4

3 に答える 3

8

"/bin/sh"スクリプトの場合、なぜ明示的に呼び出す必要があるのですか?

スクリプトに実行権限があり、上部に適切なシバンがある限り、実行可能ファイルであるかのようにスクリプトを実行できるはずです。

于 2013-02-01T22:47:12.727 に答える
0

オプションを使用して、シェルにコマンドを実行するように依頼でき-cます。

コマンドがシェルビルトインまたはシェルスクリプトの場合、シェルはそれを実行します。外部コマンドの場合、シェルはバイナリを実行します。

これを試して、それがあなたのために働くかどうか確かめてください:

execl("/bin/sh", "/bin/sh", "-c", path, (char*) 0);

編集:上記の呼び出しを修正しました。これでうまくいくはずです。私はでテストしました

execl("/bin/sh", "/bin/sh", "-c", "set", NULL);

私のテストプログラムはデフォルトのシェル変数をエコーし​​ました。それから私はでテストしました

execl("/bin/sh", "/bin/sh", "-c", "/usr/bin/clear", NULL);

テストプログラムがターミナルエミュレータの画面をクリアしました。

注:この回答の良い点は、シェルから実行できるすべてのものを実行することです。#!/path/to/interpreterそのため、組み込みのシェルコマンドを実行し、適切な最初の行がないシェルスクリプトを実行します。実行したいすべてのシェルスクリプトに適切な#!最初の行がある場合、これは必要ありません。これにより、必要のないシェルを実行するという犠牲を払って、もう少し堅牢なソリューションが提供されます。

于 2013-02-01T22:40:14.030 に答える
0

ユーザーに警告しない場合は、ファイルにexec権限があるかどうかを確認する必要があります。GlibCのlstat関数を使用してそれを実行できます。次に、GlibCからexecveを使用してパスと引数リストをフィードします(メインからenv varを取得することもできます。NULLポインターである(char *)0を指定する代わりに、プログラムに環境を指定することをお勧めします)

于 2013-02-01T23:26:41.200 に答える