управлять терминалом Linux с помощью программы на C ++

Я могу открыть программу в терминале, используя:

stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());

Мое приложение продолжает работать в терминале, и я хочу закрыть это приложение внутри той же программы и снова открыть его, используя новые параметры. Как это сделать?

-2

Решение

Вы не можете сделать это с помощью system, От (BSD) man 3 system:

Процесс вызова ждет чтобы оболочка завершила выполнение команды, игнорируя SIGINT и SIGQUIT и блокируя SIGCHLD.

Таким образом, ваше приложение будет блокироваться до завершения или завершения запущенной программы.

Вы можете получить желаемое поведение, запустив программу с помощью fork/exec — справочные страницы Вот, а также Вот. Это то, что system делает под капотом. Вы запустите подпроцесс и сохраните контроль в своем приложении.

С помощью forkвы получите идентификатор процесса для вашего запущенного процесса, и с его помощью вы можете, например, прекратить программу с помощью kill — справочная страница Вот — и перезапустите программу.

Оглянись вокруг fork/exec примеров, на этом сайте, вероятно, больше, чем несколько.

3

Другие решения

system() только позволяет запустить другой процесс и получить обратно код выхода. Вы не получаете никакого контроля над жизненным циклом этого другого процесса.

Если вы хотите запускать другие процессы и управлять ими, вам нужно использовать другие методы. Классическим способом было бы fork() ваш собственный процесс на две части и exec() другой процесс у ребенка. Затем родитель получит PID ребенка от fork() позвонить, а затем может отправить подходящие сигналы от родителя, когда вы хотите прекратить его.

Это немного запутанно (особенно после того, как вы начинаете обрабатывать SIGHUP и очищать процессы зомби), но я не знаю ни стандартной библиотеки, ни библиотеки Boost, которая сделала бы вам неприятности. Вы, вероятно, должны проверить, прежде чем начать писать это вручную, хотя.

Если вы идете с fork()Есть много руководств в Интернете, которые проведут вас через специфику и идиомы, которые накапливались вокруг него на протяжении десятилетий.

2

По вопросам рекламы [email protected]