2017-09-25 20 views
-1

Linuxでスライドショープログラムを作成しようとしています。私の問題は、私の監督、mplayerの作品を実行し、ビデオを実行するが、eogまたはfeh画像を表示するために働いていない私のプログラムの自動実行を設定するときです。しかし、ターミナルから私のプログラムに電話をかけて、ビデオや画像を表示すると、うまくいきます。スーパーバイザでプログラム自動実行を設定すると、C言語のsystem()関数が機能しない

ここはsystem()呼び出しのコードです。

if(!strcmp(ext,".JPG") || !strcmp(ext,".jpg") || !strcmp(ext, ".gif") || !strcmp(ext,".png") || !strcmp(ext, ".PNG") || !strcmp(ext, ".GIF")) 
{ 
    char command[1000]; 
    snprintf(command, sizeof(command), "eog -f %s%s&", FILE_PATH, liste[counter]); 
    if(childpid != 0) 
    { 
    char kill_command[100]; 
    snprintf(kill_command, sizeof(kill_command), "kill %d", childpid); 
    system(kill_command); 
    childpid=0; 
    } 
    system(command); 
    sleep(5); 
    childpid = getpid() + 2; 
    exit(EXIT_SUCCESS); 
} 
else if (!strcmp(ext,".mov") || !strcmp(ext, ".mp4") || !strcmp(ext, ".avi") || !strcmp(ext,".wmv")) 
{ 
    if(childpid != 0) 
    { 
    char kill_command[100]; 
    snprintf(kill_command, sizeof(kill_command), "kill %d", childpid); 
    system(kill_command); 
    childpid=0; 
    } 
    char command[1000]; 
    snprintf(command, sizeof(command), "omxplayer -o hdmi -b %s%s", FILE_PATH, liste[counter]); 
    system(command); 
    exit(EXIT_SUCCESS); 
} 
+1

端末からプログラムを実行すると、個人設定、特に 'PATH'と' DISPLAY'環境変数を継承します。これらの環境変数は、スーパーバイザがプログラムを実行しようとするときにはおそらく異なります。 –

+5

'childpid = getpid()+ 2'何?!?!これは絶対にやめてください。 'fork'と' exec'について学んでください。 –

+0

私のパスは静的なのでパスからではありませんが、設定を表示するかどうかはわかりません。私は、mplayerは "-o hdmi"パラメータのビートを働くと思う。それはhdmiにビデオを送信しますが、私はeogまたはfehのための同様の設定を見つけることができませんでした。私は "eog -f --display =:0 path"または "DISPLAY =:0.0 eog -f path"を試しましたが、うまくいきませんでした。 – mehmet

答えて

0

system(3)を読んでください。それは/bin/sh -cをフォークするので、sh(1p)、次にbash(1)と読んでください。コマンドは、$PATHを使用してexecvp(3)またはそれに相当する内部シェルで検索されます。

eogのいずれかがご使用の$PATHに見つからないか、デフォルトのものが見つからないか、たとえば表示できません。いくつかの紛失があるため(例えばXOpenDisplay(3)が間接的にeogによって呼び出されるために必要です)。おそらくeogをあなたのシェルスクリプト(eogを実行する前にstderrをリダイレクトする)で置き換えることができます。

もっと多くのことを学ぶ必要があるので、Advanced Linux Programming(自由にダウンロード可能)をお読みください。たとえば、childpid = getpid() + 2;(またはpid_tの任意の算術)は完全ではありません。 fork system callは不可欠ですが、理解するのは難しいです。少なくともfork(2)execve(2)waitpid(2)、おそらくpipe(7)

を参照してください。デバッガを使用してプログラムをデバッグできます。慎重にgdbforkを処理できます。

ところで、killからsystem(3)をコマンドとして使用するのは間違いです。 kill(2)システムコールが必要ですが、おそらくそれは必要ありません。 signal(7)も参照してください。

関連する問題