web-dev-qa-db-ja.com

LinuxのプロセスのPIDをCで取得する方法

KillAPIを使用してプロセスを強制終了する必要があります。そのためには、プロセスのプロセスIDが必要です。私はそれを使用して取得しようとしました:

ret = system("pidof -s raj-srv");

しかし、それは正しい値を返していません。私はこれを使用してプロセスを強制終了したくありません:

ret = system("pkill raj");

プロセスIDを取得するために使用できるAPIはありますか?

11
ravi J

systemの返品ステータスを取得しています。それはpidではありません。あなたはこのようなものが欲しいです:

char line[LEN];
FILE *cmd = popen("pidof...", "r");

fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);

pclose(cmd);
18
cnicutar

その場合、実行中のプロセスのインスタンスが複数存在する可能性があります。pidofは、スペースで区切られたpidの文字列を返します。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
        char pidline[1024];
        char *pid;
        int i =0
        int pidno[64];
        FILE *fp = popen("pidof bash","r");
        fgets(pidline,1024,fp);

        printf("%s",pidline);
        pid = strtok (pidline," ");
        while(pid != NULL)
                {

                        pidno[i] = atoi(pid);
                        printf("%d\n",pidno[i]);
                        pid = strtok (NULL , " ");
                        i++;
                }

        pclose(fp);
}
3
Alok Prasad

system()呼び出しはpidofの出力を返さず、pidofの戻りコードを返します。成功した場合はゼロです。

popen()の代わりにsystem()を使用してpidofの出力を消費することもできますが、もっと良い方法(pidof自体が使用する方法)があると確信しています。 )。おそらくそれは/procをさまよっています。

2
Marcelo Cantos

system関数によって返されるのは、実行されているコマンドからの戻りコードです。

あなたができることはこのようなものです:

system("pidof -s raj-srv > /tmp/pid-of-raj-srv");

そして、ファイルの内容を読み取ります/tmp/pid-of-raj-srv

新鮮なスレッドではないことは承知していますが、最近同じ質問に直面したばかりなので、お伺いします。あなたはこれの1つを見ましたか:

sysctlを使用すると、system( "bla, bla" )呼び出しを経由せずに、必要な情報を提供できます。最初ははるかに複雑に見えますが、ニーズによっては価値があるかもしれません。

1
j4x