C++ getenv 不更新
C++ getenv doesnt update
我正在尝试制作一个 bash 脚本 运行 的程序。我希望 bash 脚本能够改变 c++ 程序的状态,而我唯一能找到的就是使用环境变量。事情是,它似乎 getenv 只在程序 运行.
时获取值
Bash
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,并且永不停止。如何在程序 运行ning 时获取更新的环境变量?或者是否有更好的方法让 bash 脚本控制 C++ 程序的状态。
EDIT 我应该注意,我不想只是终止进程,因为它在结束时必须关闭硬件.
当您在 bash 中更改 C++ 程序环境时,它不会改变 - 因为当您启动程序时,它会获得父进程环境的副本,并且无法访问父进程的环境。
但是,您可以使用文件轻松共享数据。
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;
}
程序启动后无法修改程序环境。您必须使用另一种进程间通信方法。最简单的方法是为您的应用程序注册一些信号的处理程序(例如 SIGUSR1),然后使用 kill -SIGUSR1 <pid>
命令发送它。
还有其他可用的解决方案,例如创建命名管道(使用 pipe
shell 命令),并定期检查是否有人向其中写入内容。如果是,退出循环。
如果需要,您也可以使用套接字,但这可能会更复杂。
我正在尝试制作一个 bash 脚本 运行 的程序。我希望 bash 脚本能够改变 c++ 程序的状态,而我唯一能找到的就是使用环境变量。事情是,它似乎 getenv 只在程序 运行.
时获取值Bash
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,并且永不停止。如何在程序 运行ning 时获取更新的环境变量?或者是否有更好的方法让 bash 脚本控制 C++ 程序的状态。
EDIT 我应该注意,我不想只是终止进程,因为它在结束时必须关闭硬件.
当您在 bash 中更改 C++ 程序环境时,它不会改变 - 因为当您启动程序时,它会获得父进程环境的副本,并且无法访问父进程的环境。
但是,您可以使用文件轻松共享数据。
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;
}
程序启动后无法修改程序环境。您必须使用另一种进程间通信方法。最简单的方法是为您的应用程序注册一些信号的处理程序(例如 SIGUSR1),然后使用 kill -SIGUSR1 <pid>
命令发送它。
还有其他可用的解决方案,例如创建命名管道(使用 pipe
shell 命令),并定期检查是否有人向其中写入内容。如果是,退出循环。
如果需要,您也可以使用套接字,但这可能会更复杂。