【问题标题】:C++ getenv doesnt updateC++ getenv 不更新
【发布时间】:2015-06-10 17:25:00
【问题描述】:

我正在尝试制作一个 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++ 程序的状态。

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

【问题讨论】:

  • 环境不是这样运作的。生成的进程在启动时会获得其父环境的副本,然后两者不再连接。如果您想与您的应用程序交谈,那么您需要一个通信渠道。信号、管道、套接字、标准输入、程序轮询的控制文件等
  • 供参考:由于当前的问题是“我该如何做这件不可能的事情或任何其他事情”,所以我投票结束。对 UNIX IPC 机制的完整调查太大了。请阅读 Etan 提到的内容,弄清楚您需要什么,然后在您有新问题时回来。

标签: c++ linux bash getenv


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    不过,您可以使用文件轻松共享数据。

    重击

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多