Я пишу свое приложение на C ++ в Linux. В C ++ есть функция system для выполнения программы.
Я пытаюсь открыть gnome-system-monitor из C ++ следующим образом:
system("gnome-system-monitor");
Тем не менее, поток моего приложения блокируется, когда я вызываю эту «системную» функцию, пока я не закрою окно gnome-system-monitor.
Любые другие способы открыть процесс из файла, не блокируя процесс вызывающего?
Классический способ, который работает в любой системе Linux или POSIX, это
if (0 == fork()) {
execlp("gnome-system-monitor", "gnome-system-monitor", (char *)NULL);
}
(с обработкой ошибок, опущенной в этом примере.) Это (a) создает новый процесс, (b) в этом новом процессе, запускает «gnome-system-monitor» после поиска переменной среды PATH, чтобы найти такую команду, (c) передает ему имя «gnome-system-monitor» как argv [0] и никаких других аргументов. В родительском объекте, когда новый процесс создан, он движется вперед, не ожидая какого-либо результата.
Смотрите справочные страницы для fork
а также execlp
Больше подробностей.
fork / exec или posix_spawn. У glib также есть GSpawn, если вы используете это.
Gnome построен над GTk (который содержит Glib), и вы, вероятно, хотите Glib Нерестовые процессы функции.
Конечно, в Linux и Unix, процессы являются раздвоенный. Прочитайте хорошую книгу, как
расширенное программирование Unix а также расширенное программирование в Linux узнать больше о Системные вызовы связанные с процессами, в частности, вилка (2), execve (2), трубы (2). Читайте также о Proc (5) файловая система.
Да. Вызов функции системы в отдельном потоке.