5

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

つまり、blink プログラムを実行し、5 秒待ってから環境の設定を解除します。ただし、C++ プログラムは常に環境値を 1 と見なし、停止することはありません。プログラムの実行中に更新された環境変数を取得するにはどうすればよいですか? または、bash スクリプトで C++ プログラムの状態を制御するより良い方法はありますか。

EDIT終了時にハードウェアをオフにする必要があるため、プロセスを単に強制終了したくないことに注意してください。

4

2 に答える 2

3

起動後にプログラム環境を変更することはできません。プロセス間通信の別の方法を使用する必要があります。最も簡単な方法は、何らかのシグナル (SIGUSR1 など) のハンドラーをアプリに登録し、kill -SIGUSR1 <pid>コマンドを使用して送信することです。

pipe(シェル コマンドを使用して) 名前付きパイプを作成し、誰かが何かを書き込んだかどうかを定期的に確認するなど、他の解決策も利用できます。はいの場合、ループを終了します。

必要に応じてソケットを使用することもできますが、これはより複雑になる可能性があります。

于 2015-06-10T17:37:52.537 に答える
1

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;
}
于 2015-06-10T17:30:31.467 に答える