Программа My C, работающая под Linux, хочет узнать по имени, если другая программа запущена. Как это сделать?Программа C под Linux: как узнать, запущена ли другая программа
ответ
Есть два способа в основном:
- Используйте
popen("pgrep yourproc", "r");
и затемfgets
от него - Использование
opendir
иreaddir
для разбора/proc
- это в основном то, чтоps(1)
делает
Не чистейшая, но Я бы пошел с первым из них.
Я бы выбрал второе, потому что вы можете найти много интересного в '/ proc/$ pid' - настоящий поучительный. – Mat
@Mat Конечно, это более интересно, и это технически ** правильный путь **, чтобы сделать это (не создавая два процесса, не используя оболочку и т. Д.). Но вы должны быть прагматичными: требуется больше времени для написания, и я бы не сказал, что это просто. – cnicutar
Ты, конечно, прав. Просто обход каталога, когда вы можете ожидать, что каталоги исчезнут из-под вас, - это упражнение _fun_ при обработке ошибок. – Mat
В 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;
}
Если вы хотите посмотреть на то, как «правильно», чтобы сделать это, проверить следующее:
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-9] + $" до "^ [0-9] \\ + $" – icecream
- 1. Как узнать, какая программа была запущена?
- 2. Идентифицировать, была ли запущена программа
- 3. C++ Linux Interact Другая программа stdin/stdout
- 4. PHP - Проверьте, запущена ли программа
- 5. VBS Как определить, запущена ли программа
- 6. Как определить, запущена ли программа из valgrind?
- 7. Программа не может быть запущена в Linux
- 8. Как закрыть программу, если другая программа уже запущена?
- 9. Как проверить, запущена ли программа из автозапуска?
- 10. C# Файл используется Другая программа
- 11. Как проверить, запущена ли программа в bash?
- 12. Как проверить, запущена ли программа скриптом python?
- 13. Проверьте, запущена ли программа через другую.
- 14. Как проверить, запущена ли моя программа?
- 15. Как проверить, запущена ли программа .net 4.6.1
- 16. Как проверить, запущена ли программа с консоли?
- 17. Как получить каталог, из которого запущена программа?
- 18. Программа не будет запущена
- 19. linux - проверьте, умерла ли программа
- 20. Как программа C скажет, была ли она запущена из Finder?
- 21. Определение, запущена ли программа на Windows Server
- 22. Python- Как проверить, не запущена ли программа во время работы?
- 23. Отладка! Программа не будет запущена
- 24. Linux mutex для проверки того, что программа уже запущена?
- 25. запущена программа python с сайта
- 26. Взаимодействие VS и другая программа
- 27. как daemonize программа c/C++ в Linux
- 28. Самовосстановительная программа на segfault под Linux
- 29. C# - проверить, запущена ли программа для текущего пользователя
- 30. Программа была запущена пользователем или планировщиком?
@Mat - «по имени» значит, что я хочу, чтобы оформить вызов функции с именем программы, как C-строка в качестве аргумента и получить логическое возвращение: истинное для да, эта именованной программа запущена; или false для нет, эта именованная программа не запущена. Я ничего не пробовал, но только искал и ничего не нашел. Я бы попробовал систему (ps) или подобное, но я надеюсь на что-то гораздо более простое и более прямолинейное. –