2011-10-01 15 views
2

Linuxで動作しているCプログラムは、別のプログラムが動作しているかどうかを名前で調べる必要があります。どうやってするの?LinuxのCプログラム:別のプログラムが実行されているかどうかを調べる方法

+1

@Mat - "by name"は、プログラム名を引数としてC文字列として関数呼び出しを実行し、ブール型の戻り値を取得することを意味します。いいえの場合はfalseです。この名前付きプログラムは実行されていません。私は何も試していないが、グーグルでしか見つからなかった。私はシステム(ps)または同様のものを試してみるだろうが、もっと単純でより簡単なものを望んでいる。 –

答えて

6

あり基本的に2つの方法があります。/procを解析する

  • 使用popen("pgrep yourproc", "r");、その後fgets使用opendirreaddir
  • それからは - これは ps(1)

ないクリーン何をするか、基本的ですが、私はこれらの最初のものと一緒に行くだろう。

+1

'/ proc/$ pid'で興味深いものをたくさん見つけることができるので、2番目に行くでしょう。 – Mat

+1

@Matもちろん、面白いですし、技術的には**正しい方法です**(2つのプロセスを生成しない、シェルを使用しないなど)。しかし、あなたは実用的でなくてはなりません。書き込みに時間がかかってしまいます。それは簡単だとは言いません。 – cnicutar

+1

あなたは確かにそれについて正しいです。ディレクトリのトラバーサルだけで、ディレクトリがあなたの下から消えてしまうことが期待できるときは、エラー処理のための練習です。 – Mat

2

unixでは、プログラムは実行されません。 プロセスが実行されます。プロセスはプログラムのインスタンスとして見ることができます。プロセスは、別の名前で動作したり、名前を変更したり、まったく名前を持たないことがあります。また、実行時には、プログラムは(ディスク上に)終了しなくても、コアにのみ存在することさえできます。例えば次のプログラムを取る:(?は/ dev/nullが実際に実行されて、私はそうは思いません...)

#include <unistd.h> 
#include <string.h> 

int main(int arc, char **argv) 
{ 

if (strcmp(argv[0], "/dev/null")) { 
    execl(argv[0], "/dev/null", NULL); 
    } 

sleep (30); 
return 0; 
} 
3

Travesing /procは本当にpopen()よりもはるかに困難ではありません。基本的には3つのことを行います

  • すべての数字は/procという形式で入力してください。
  • /proc/<PID>/command/
  • によってコマンドの呼び出しを取得します。必要なプロセスの名前に対して正規表現を実行します。

わかりやすくするためにいくつかのエラー処理を省略しましたが、それはあなたが望むように何かする必要があります。

int 
main() 
{ 
    regex_t number; 
    regex_t name; 
    regcomp(&number, "^[0-9]+$", 0); 
    regcomp(&name, "<process name>", 0); 
    chdir("/proc"); 
    DIR* proc = opendir("/proc"); 
    struct dirent *dp; 
    while(dp = readdir(proc)){ 
     if(regexec(&number, dp->d_name, 0, 0, 0)==0){ 
       chdir(dp->d_name); 
       char buf[4096]; 
       int fd = open("cmdline", O_RDONLY); 
       buf[read(fd, buf, (sizeof buf)-1)] = '\0'; 
       if(regexec(&name, buf, 0, 0, 0)==0) 
        printf("process found: %s\n", buf); 
       close(fd); 
       chdir(".."); 
     } 
    } 
    closedir(proc); 
    return 0; 
} 
+0

これは動作しますが、何らかの理由で「^ [0-9] + $」のプラス記号を「^ [0-9] \\ + $」にエスケープしなければなりませんでした – icecream

関連する問題