Программа на C под Linux: как узнать, запущена ли другая программа - PullRequest
2 голосов
/ 01 октября 2011

Моя программа на C, работающая под Linux, хочет по имени узнать, запущена ли другая программа.Как это сделать?

Ответы [ 4 ]

6 голосов
/ 01 октября 2011

Есть два основных способа:

  • Используйте popen("pgrep yourproc", "r");, а затем fgets из него
  • Используйте opendir и readdir для разбора /proc - это в основном то, что ps(1) делает

Не самый чистый, но я бы пошел с первым из них.

3 голосов
/ 02 октября 2011

Путешествие /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;
}
2 голосов
/ 01 октября 2011

В 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;
}
0 голосов
/ 01 октября 2011

Если вы хотите найти «правильный» способ сделать это, проверьте следующее:

Linux API для просмотра списка запущенных процессов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...