Я могу открыть программу в терминале, используя:
stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());
Мое приложение продолжает работать в терминале, и я хочу закрыть это приложение внутри той же программы и снова открыть его, используя новые параметры. Как это сделать?
Вы не можете сделать это с помощью system
, От (BSD) man 3 system
:
Процесс вызова ждет чтобы оболочка завершила выполнение команды, игнорируя SIGINT и SIGQUIT и блокируя SIGCHLD.
Таким образом, ваше приложение будет блокироваться до завершения или завершения запущенной программы.
Вы можете получить желаемое поведение, запустив программу с помощью fork
/exec
— справочные страницы Вот, а также Вот. Это то, что system
делает под капотом. Вы запустите подпроцесс и сохраните контроль в своем приложении.
С помощью fork
вы получите идентификатор процесса для вашего запущенного процесса, и с его помощью вы можете, например, прекратить программу с помощью kill
— справочная страница Вот — и перезапустите программу.
Оглянись вокруг fork
/exec
примеров, на этом сайте, вероятно, больше, чем несколько.
system()
только позволяет запустить другой процесс и получить обратно код выхода. Вы не получаете никакого контроля над жизненным циклом этого другого процесса.
Если вы хотите запускать другие процессы и управлять ими, вам нужно использовать другие методы. Классическим способом было бы fork()
ваш собственный процесс на две части и exec()
другой процесс у ребенка. Затем родитель получит PID ребенка от fork()
позвонить, а затем может отправить подходящие сигналы от родителя, когда вы хотите прекратить его.
Это немного запутанно (особенно после того, как вы начинаете обрабатывать SIGHUP и очищать процессы зомби), но я не знаю ни стандартной библиотеки, ни библиотеки Boost, которая сделала бы вам неприятности. Вы, вероятно, должны проверить, прежде чем начать писать это вручную, хотя.
Если вы идете с fork()
Есть много руководств в Интернете, которые проведут вас через специфику и идиомы, которые накапливались вокруг него на протяжении десятилетий.