본문 바로가기

Programming/Linux_Platform

get pid by process name - example source code (예제 코드)

원문 : https://phoxis.org/2013/09/13/find-process-ids-of-a-running-process-by-name/




이름으로 pid 를 찾아내는 예제


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <ctype.h>

#include <dirent.h>

#include <libgen.h>

 

/* checks if the string is purely an integer

    * we can do it with `strtol' also

     */

int check_if_number (char *str)

{

      int i;

        for (i=0; str[i] != '\0'; i++)

     {

     if (!isdigit (str[i]))

     {

       return 0;

   }

       }

 return 1;

}

 

#define MAX_BUF 1024

#define PID_LIST_BLOCK 32

 

int *pidof (char *pname)

{

      DIR *dirp;

        FILE *fp;

 struct dirent *entry;

   int *pidlist, pidlist_index = 0, pidlist_realloc_count = 1;

     char path[MAX_BUF], read_buf[MAX_BUF];

      

       dirp = opendir ("/proc/");

 if (dirp == NULL)

       {

       perror ("Fail");

   return NULL;

     }

  

   pidlist = (int *)malloc (sizeof (int) * PID_LIST_BLOCK);

     if (pidlist == NULL)

   {

   return NULL;

     }

      

       while ((entry = readdir (dirp)) != NULL)

     {

     if (check_if_number (entry->d_name))

     {

       strcpy (path, "/proc/");

     strcat (path, entry->d_name);

           strcat (path, "/comm");

    

         /* A file may not exist, it may have been removed.

           * dut to termination of the process. Actually we need to

          * make sure the error is actually file does not exist to

         * be accurate.

        */

         fp = fopen (path, "r");

       if (fp != NULL)

         {

             fscanf (fp, "%s", read_buf);

             if (strcmp (read_buf, pname) == 0)

         {

               /* add to list and expand list if needed */

               pidlist[pidlist_index++] = atoi (entry->d_name);

         if (pidlist_index == PID_LIST_BLOCK * pidlist_realloc_count)

               {

               pidlist_realloc_count++;

           pidlist = (int*)realloc (pidlist, sizeof (int) * PID_LIST_BLOCK * pidlist_realloc_count); //Error check todo

               if (pidlist == NULL)

               {

                 return NULL;

             }

         }

         }

             fclose (fp);

           }

   }

       }

 

 

 closedir (dirp);

   pidlist[pidlist_index] = -1; /* indicates end of list */

     return pidlist;

}

 

int main (int argc, char *argv[])

{

      int *list, i;

       

        if (argc != 2)

     {

     printf ("Usage: %s proc_name\n", argv[0]);

         return 0;

   }

 list = pidof (argv[1]);

   for (i=0; list[i] != -1; i++)

 {

         printf ("%d ", list[i]);

   }

     free (list);

       if (list[0] != -1)

     {

     printf ("\n");

       }

 return 0;

}