Linux — C ++ Getenv не обновляется

Я пытаюсь сделать программу, которая запускает скрипт 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 ++.

РЕДАКТИРОВАТЬ Я должен отметить, что я не хочу просто убивать процесс, потому что он должен выключить аппаратное обеспечение, когда он заканчивается.

1

Решение

Невозможно изменить программную среду после ее запуска. Вы должны использовать другой метод межпроцессного взаимодействия. Самый простой — зарегистрировать обработчик для некоторого сигнала в вашем приложении (например, SIGUSR1), а затем отправить его, используя kill -SIGUSR1 <pid> команда.

Есть и другие доступные решения, например, создать именованный канал (используя pipe командной оболочки), и периодически проверяйте, написал ли кто-нибудь что-нибудь. Если да, выйдите из цикла.

Вы также можете использовать сокеты, если хотите, но это может быть более сложным.

1

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

Среда программ на С ++ не меняется при изменении в 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;
}
0

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