Я пытаюсь сделать программу, которая запускает скрипт bash. Я хочу, чтобы скрипт bash мог изменять состояние программы на c ++, и единственное, что я смог найти, — это использовать переменные окружения. Дело в том, что кажется, что getenv получает значение только во время запуска программы.
удар
export BLINK=1
./blink &
sleep 5s
unset BLINK
C ++
int main(int args, char **argv) {
char *blink = getenv("BLINK");
while(blink && blink[0] == '1')
{
std::cout << getenv("BLINK") << std::endl;
usleep(500000);
}
return 1;
}
Итак, что это делает, это запустить программу мигания, подождите 5 секунд, а затем сбросьте среду. Однако программа C ++ всегда видит значение окружения как 1 и никогда не останавливается. Как получить обновленную переменную среды во время работы программы? Или есть лучший способ, чтобы скрипт bash контролировал состояние программы на c ++.
РЕДАКТИРОВАТЬ Я должен отметить, что я не хочу просто убивать процесс, потому что он должен выключить аппаратное обеспечение, когда он заканчивается.
Невозможно изменить программную среду после ее запуска. Вы должны использовать другой метод межпроцессного взаимодействия. Самый простой — зарегистрировать обработчик для некоторого сигнала в вашем приложении (например, SIGUSR1), а затем отправить его, используя kill -SIGUSR1 <pid>
команда.
Есть и другие доступные решения, например, создать именованный канал (используя pipe
командной оболочки), и периодически проверяйте, написал ли кто-нибудь что-нибудь. Если да, выйдите из цикла.
Вы также можете использовать сокеты, если хотите, но это может быть более сложным.
Среда программ на С ++ не меняется при изменении в bash — поскольку при запуске вашей программы она получает копию среды родителя и не имеет доступа к среде родительского процесса.
Однако вы можете использовать файл для простого обмена данными.
удар
echo "1" > blink.txt
./blink &
sleep 5s
echo "0" > blink.txt
C ++
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <unistd.h>
using namespace std;
string getfile(const string& filename) {
ifstream in(filename.c_str(), ios_base::binary);
in.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit);
return string(istreambuf_iterator<char>(in), istreambuf_iterator<char>());
}
int main(int argc, char* argv[]) {
string blink = getfile("blink.txt");
while(blink[0] == '1')
{
std::cout << getfile("blink.txt") << std::endl;
usleep(500000);
}
return 1;
}