2017-09-14 15 views
-1

私のプログラムは文字列(シェルスクリプトのパス)を入力として受け取ります。今度はそのシェルスクリプトを起動し、そのシェルスクリプトのプロセスIDを見つけなければなりません。プログラム名を使用してプロセスIDを見つける

system()関数を使用してシェルスクリプトを起動し、その後popen()ps -aef | grep "ShellScript"を使用してPIDを取得しています。

これを行うには、より良い方法があることが私に示唆されています。私がやったやり方は、複数のスクリプトが同時に実行されている場合、間違ったPIDを与えます。

起動後に特定のスクリプト名に対してPIDを取得する正しい方法は何ですか?

+2

_「複数のスクリプトが同時に実行されている場合は、間違ったPIDを与えるだろう。」_ですから、複数のPIDを処理する必要がありますか? – user0042

+1

[フォーク()](https://linux.die.net/man/2/fork)と[exec()](https://linux.die.net/man/3/exec)を参照してください。 – Galik

+1

'system()'を 'fork()'と 'exec ...()'に置き換えるのが一番簡単な方法かもしれません。しかし、現時点でどのように物事を達成していますか?スクリプトが終了するまで、通常は 'system()'は返されません... –

答えて

0

まず、system()を使用しないでください。

より良いアプローチは、あなたが子供である場合は、親プロセスにある場合PID> 0とreturn 0を返すfork()を、使用されるだろう。 他の戻りsatusはエラーであり、それに応じてerrnoが設定されます。

あなたは子プロセスである場合、親1におけるそれのためにしばらくあなたがすべきwaitどちらかあなたはゾンビプロセスを持っているか、SIGCHLD信号を処理するために避けたい場合は、あなたのコマンドをexec必要があります。

洞察のために、常にmanをお読みください。ここで

は簡単な例である

int pid = -1; 

If((pid = fork()) > 0) 
{ 
    /* Parent process*/ 
    wait(NULL); 
} 
else if(pid == 0) 
{ 
    /*Child process*/ 
    execv(....); 

    exit (0); 
} 
else 
{ 
    /*Error*/ 
    perror("fork()"); 
} 
関連する問題