2017-11-09 13 views
0

execlpの代わりにexeclを使用することをお勧めしますか? 私はおそらく、プログラムが2つの異なるフォルダにある場合は、execlpを使用すると混乱する可能性がありますが、それが唯一のケースかどうかはわかりません。 execlp("ls", ...)の書き込みがexecl("/bin/ls", ...)の書き込みよりも簡単だと思うので、私は尋ねます。 PATH経由でプログラムを見上げるExeclp vs Execl

+1

あなたが実行している気にしない場合は、誰かが '/ binに/' '前PATH'ディレクトリで立ち往生している可能性があるls'任意どんな'、必ず、 'execlp'でナットを行きます。一貫性のある動作が必要な場合は、明示的にするか? – ShadowRanger

+0

'ls'の場合、バージョンは' $ PATH'のどこかにある可能性があります。あなたが書いたあいまいなプログラムについては、必ず '$ PATH'にあることは明らかではありません。したがって、 'execlp()'のもう1つのリスクは、あなたのプログラムが見つからないということです。一方、 'execl()'の問題は、プログラムが見つかる場所を正確に指定することであり、存在しなければ失敗するということです。あなたはリスクをバランスさせなければなりません。 –

答えて

1

セキュリティ

は便利ですが、それはまた、安全でないことができます。ユーザーの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 

0

両方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 
関連する問題