2011-10-01 3 views
2

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

+1

@Mat - «по имени» значит, что я хочу, чтобы оформить вызов функции с именем программы, как C-строка в качестве аргумента и получить логическое возвращение: истинное для да, эта именованной программа запущена; или false для нет, эта именованная программа не запущена. Я ничего не пробовал, но только искал и ничего не нашел. Я бы попробовал систему (ps) или подобное, но я надеюсь на что-то гораздо более простое и более прямолинейное. –

ответ

6

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

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

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

+1

Я бы выбрал второе, потому что вы можете найти много интересного в '/ proc/$ pid' - настоящий поучительный. – Mat

+1

@Mat Конечно, это более интересно, и это технически ** правильный путь **, чтобы сделать это (не создавая два процесса, не используя оболочку и т. Д.). Но вы должны быть прагматичными: требуется больше времени для написания, и я бы не сказал, что это просто. – cnicutar

+1

Ты, конечно, прав. Просто обход каталога, когда вы можете ожидать, что каталоги исчезнут из-под вас, - это упражнение _fun_ при обработке ошибок. – Mat

2

В unix, программ не запускается. Процессы перспективе. Процесс можно рассматривать как экземпляр программы. Процесс может работать под другим именем или изменять его имя или вообще не иметь имени. Кроме того, во время работы программа может даже перестать выходить (на диск) и существовать только в ядре. Возьмем, например, следующую программу: (? В/DEV/нуль на самом деле работает, я так не думаю ...)

#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

Смежные вопросы