execlp
の代わりにexecl
を使用することをお勧めしますか? 私はおそらく、プログラムが2つの異なるフォルダにある場合は、execlp
を使用すると混乱する可能性がありますが、それが唯一のケースかどうかはわかりません。 execlp("ls", ...)
の書き込みがexecl("/bin/ls", ...)
の書き込みよりも簡単だと思うので、私は尋ねます。 PATH
経由でプログラムを見上げるExeclp vs Execl
答えて
セキュリティ
は便利ですが、それはまた、安全でないことができます。ユーザーのPATH
のディレクトリが書き込み可能な場合は、PATH
ルックアップに悪質なプログラムを挿入することができます。これはexeclp
には影響しますが、execl
には影響しません。あなたが持っていた場合例えば
、/foo/bar/bin:/home/you/bin:/usr/bin:/bin
と/foo/bar/bin
などのPATH
は、世界の書き込み可能な、/foo/bar/bin/ls
に悪意のあるプログラムをコピーすることができ、そのマシンへのアクセス権を持つ人がいました。 ls
を実行すると、/bin/ls
ではなく/foo/bar/bin/ls
が実行されます。彼らはあなたと同じようにコマンドを実行し、より大きなアクセスを得ることができます。
このため、既知の場所にある特定の実行可能ファイルを参照することをお勧めします。または実行可能ファイルに安全なPATH
を配線してください。
While there is a common set of Unix commands and features specified by POSIX
の互換性は、多くのプログラムは、拡張子に依存しています。あなたのプログラムがこれらの拡張機能を使用している場合、PATH
の最初のものを取得することは良い考えではないかもしれません。
たとえば、ここでOS Xにインストールされているユーティリティーは/bin
と/usr/bin
で、BSD風味です。しかし私はPATH
に以前にインストールされたGNUバージョンを持っています。 OS X上で動作するように設計されたプログラムは、例えば、/bin/ls
または/usr/bin/tar
を明示的に使用して、これらのユーティリティの既知のバージョンを取得するようにしたいと考えています。
$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3
$ tar --version
tar (GNU tar) 1.29
両方execl()
とexeclp()
細かい作業と同様に、あなたの実行可能ファイルは別のフォルダに、同じフォルダ内にありますが、あなたは別のフォルダ場合、$ PATHを設定する必要がある場合。
execl()
は、あなたが、その場合にはexeclp()
に行くことができないようコマンドラインから(「LS」のような)実行可能ファイルを実行するために必要とされています。私は以下のスナップショットを追加しました。
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if(argc!=2)
{
printf("Usage Msg: ./a.out userdefined_executable \n");
return;
}
//execl(argv[1],argv[1],NULL);//**it works**
execlp(argv[1],argv[1],NULL);//**it doesn't work**
return 0;
}
//Input will be like this, here "p1" is an user-defined executable.
//[email protected]:~/stack_overflow$ ./a.out p1
- 1. EXECL +は-exec +見つける:「`-exec
- 2. Cプログラミング - execlp()ヘルプ?
- 3. は2回EXECL
- 4. C++ ServerSocket()、FD_CLOEXEC、fork()&execl()
- 5. EXECL&printf関数 - オーダー
- 6. execlで標準入力 '<'を使用するには?
- 7. echolとmd5sumを含むExeclp
- 8. のexeclpの複数の「プログラム」
- 9. フォーク、execlpと殺す。ゾンビプロセス
- 10. execlpを待っている
- 11. UNIXでのexeclの動作
- 12. execl()が動作するのに問題があります
- 13. Cプログラムでのexeclp()の使用
- 14. C++フォーク、待機なし、defuncts execl
- 15. execl子どもから離れることはありません
- 16. C - va_listをsentinel-terminated関数に渡す - execlp()のラッパーが必要
- 17. execlpはソケットを使用してデータを送信しません
- 18. 2つのパイプ、1つのフォーク、bcとexeclp(C)
- 19. Cのexeclp()は実行後にプロンプトを返さない
- 20. execlpはどのように正確に動作しますか?
- 21. Execlpは別の端末で実行する
- 22. Cでexeclpを通してpipefdを渡す
- 23. なぜシステムコールセクションで `execlp()`が使われないのですか
- 24. C execlp()が正しくパラメータを解析しないstring
- 25. execlを使ってgrepの値を取得
- 26. execlコマンドをLinux下で実行するubuntu
- 27. execl()の引数はどこに渡されますか?
- 28. execlとexecvの違いは何ですか?
- 29. bashインタプリタのstdin/outを読み書きします。linux、fork-execl
- 30. _mm_load_ps vs. _mm_load_pd vs.
あなたが実行している気にしない場合は、誰かが '/ binに/' '前PATH'ディレクトリで立ち往生している可能性があるls'任意どんな'、必ず、 'execlp'でナットを行きます。一貫性のある動作が必要な場合は、明示的にするか? – ShadowRanger
'ls'の場合、バージョンは' $ PATH'のどこかにある可能性があります。あなたが書いたあいまいなプログラムについては、必ず '$ PATH'にあることは明らかではありません。したがって、 'execlp()'のもう1つのリスクは、あなたのプログラムが見つからないということです。一方、 'execl()'の問題は、プログラムが見つかる場所を正確に指定することであり、存在しなければ失敗するということです。あなたはリスクをバランスさせなければなりません。 –