C ++ getenv没有更新

时间:2015-06-10 17:25:00

标签: c++ linux bash 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 ++程序的状态。

编辑 我应该注意,我不想因为必须在硬件结束时关闭硬件而终止该进程。

2 个答案:

答案 0 :(得分:2)

启动后无法修改程序环境。您必须使用另一种进程间通信方法。最简单的方法是将一些信号的处理程序注册到您的应用程序(例如SIGUSR1),然后使用kill -SIGUSR1 <pid>命令发送它。

还有其他可用的解决方案,例如创建命名管道(使用pipe shell命令),并定期检查是否有人写了一些内容。如果是,退出循环。

如果需要,您也可以使用套接字,但这可能会更复杂。

答案 1 :(得分:1)

当您在bash中更改C ++程序环境时,C ++程序环境不会改变 - 因为当您启动程序时,它会获得父级环境的副本,并且无法访问父进程的环境。 / p>

但是,您可以使用文件轻松共享数据。

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;
}