2012-09-26 5 views
16

私はシェルに入力した場合、私はVLC(ビデオを再生するためのプログラム) を持っている:Cで適切な引数を指定してexecl()を呼び出す方法は?

/ホーム/ VLC「/ホーム/私の映画/私はsee.mkvたい映画」

を、それが開きますanはムービーを再生します。しかし

、私は次のプログラムを実行します。

#include <unistd.h> 

int main(void) { 

    execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL); 

    return 0; 
} 

VLCが開きますが、何も再生しません。これをどうすれば解決できますか?

は私が

execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL); 

はシェルでタイプすると同等であった

を推測:

物事は私が試した

/home/vlc /home/my movies/the movie i want to see.mkv 

動作しませんので、私は

execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL); 
を試してみました

とvlc oペンを押し上げるが再現しない。

最後にNULLを書き込むのではなく、0を試しました(char *)0、1 ....役に立たない。 ヘルプ!!!!

+1

なぜ失敗したexeclの後に 'errno'を見なかったのですか?あなたの問題についてもっと教えてくれたでしょう。 execlのmanページを慎重に読んでいるのは何ですか? :-) – Jens

答えて

27
execl("/home/vlc", 
    "/home/vlc", "/home/my movies/the movie i want to see.mkv", 
    (char*) NULL); 

argv[0]を含む実行ファイルからすべての引数を指定する必要があります。

最終的にNULLchar*にキャストされることを確認してください。

詳細はこちらです:http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html

+0

それは解決しました!ありがとう!私はこの1時間で..... ..... –

+1

s/token/taken? – Jens

+0

@Jens、fixed。あなたが何か悪いことがある場合は、修正をためらってください。 – AProgrammer

1

あなたは自分のVLCの再生処理を実行するためにのみ、それが行われ、何よりも複雑されている場合、アプリケーション・プロセスに戻す制御を与える必要がある場合は、その後、私はあなただけを使用することができたとします

system("The same thing you type into console");

+0

execlの引数にわずかな誤解を修正し、シェルが引用符を元に戻すことができるように正しく引用する関数を書く間に、私は自分の好きなものを知っています。 – AProgrammer

+0

私はあなたのポイントを取得し、あなたの優先権は合理的だと思います。しかし、このような単純なニーズに対処する場合、system()ではエスケープシーケンスバックスラッシュの混乱を避けるだけでなく、system()ではなくexecl()を使用する他のメリットはありますか? –

+0

セキュリティ上の理由があります。たとえば、 'system(buf)'で実行する 'sprintf(buf、" ls -la%s "、var)'のような文字列を持っていれば、 、 '' somefile; rm -rf〜 ''などがあります。 – netigger