📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の5版が非表示) | |||
| 42行目: | 42行目: | ||
sdbus-c++ライブラリはsd-busライブラリを使用しているが、必ずしもSystemdに制約されているわけではなく、Systemd以外の環境でも完璧に使用することができる。<br> | sdbus-c++ライブラリはsd-busライブラリを使用しているが、必ずしもSystemdに制約されているわけではなく、Systemd以外の環境でも完璧に使用することができる。<br> | ||
<br> | <br> | ||
sdbus-c++ライブラリの詳細な使用方法を知りたい場合は、[https://kistler-group.github.io/sdbus-cpp/docs/using-sdbus-c++.html sdbus-c++ライブラリの公式Webサイト]を参照すること。<br> | |||
<br> | |||
==== sdbus-c++ライブラリのライセンス ==== | ==== sdbus-c++ライブラリのライセンス ==== | ||
sdbus-c++ライブラリは、LGPL 2.1でライセンスされている。<br> | sdbus-c++ライブラリは、LGPL 2.1でライセンスされている。<br> | ||
ただし、ライブラリのヘッダファイルではLGPL Exception version 1.0ライセンスもあり、これは、以下に示すようなことを許可している。<br> | |||
<br> | <br> | ||
LGPL 2.1に対する追加的な許可として、「ライブラリを使用する作品」のオブジェクトコード形式は、ライブラリの一部であるヘッダファイルの素材を組み込んでもよい。 | LGPL 2.1に対する追加的な許可として、「ライブラリを使用する作品」のオブジェクトコード形式は、ライブラリの一部であるヘッダファイルの素材を組み込んでもよい。 | ||
| 65行目: | 68行目: | ||
==== sdbus-c++ライブラリのインストール ==== | ==== sdbus-c++ライブラリのインストール ==== | ||
===== パッケージ管理システムからインストール ===== | ===== パッケージ管理システムからインストール ===== | ||
# RHEL (EPELリポジトリが必要) | |||
sudo dnf install sdbus-cpp-devel | |||
# SUSE | # SUSE | ||
sudo zypper install sdbus-cpp-devel | sudo zypper install sdbus-cpp-devel | ||
| 70行目: | 76行目: | ||
===== ソースコードからインストール ===== | ===== ソースコードからインストール ===== | ||
sdbus-c++ライブラリのビルドに必要なライブラリをインストールする。<br> | sdbus-c++ライブラリのビルドに必要なライブラリをインストールする。<br> | ||
# RHEL | |||
sudo dnf install pkg-config make cmake gcc gcc-c++ libcap-devel expat-devel systemd-devel | |||
doxygen # ドキュメントもビルドする場合 | |||
# SUSE | # SUSE | ||
sudo zypper install pkg-config make cmake gcc gcc-c++ libcap-devel libexpat-devel libmount-devel systemd-devel | sudo zypper install pkg-config make cmake gcc gcc-c++ libcap-devel libexpat-devel libmount-devel systemd-devel | ||
| 107行目: | 117行目: | ||
#include <string> | #include <string> | ||
#include <sdbus-c++/sdbus-c++.h> | #include <sdbus-c++/sdbus-c++.h> | ||
// Systemdサービスはシグナルを送信しないため、今回は使用しない | |||
// #include <atomic> | // #include <atomic> | ||
// #include <chrono> | |||
// #include <thread> | |||
// std::atomic<bool> | // std::atomic<bool> g_keep_running(false); | ||
// UnitStateChangedシグナルハンドラ | // UnitStateChangedシグナルハンドラ | ||
// | // ただし、Systemdサービスはシグナルを送信しないため、今回は定義しない | ||
// void onUnitStateChanged(sdbus::Signal signal) | // void onUnitStateChanged(sdbus::Signal signal) | ||
// { | // { | ||
| 120行目: | 134行目: | ||
// if (unitName == "smb.service" && (newState == "active" || newState == "failed")) { | // if (unitName == "smb.service" && (newState == "active" || newState == "failed")) { | ||
// | // g_keep_running.store(true); | ||
// } | // } | ||
// } | // } | ||
| 195行目: | 209行目: | ||
auto method = systemdProxy->createMethodCall(interfaceName, methodName); | auto method = systemdProxy->createMethodCall(interfaceName, methodName); | ||
// Systemdサービスはシグナルを送信しないため、今回は定義しない | |||
//systemdProxy->uponSignal("JobRemoved") | |||
// .onInterface("org.freedesktop.systemd1.Manager") | |||
// .call(&onUnitStateChanged); | |||
// D-Busサービスを実行する | |||
// "smb.service"は開始するSystemdサービス名 | // "smb.service"は開始するSystemdサービス名 | ||
// "replace"はSystemdサービスの起動モード | // "replace"はSystemdサービスの起動モード | ||
| 200行目: | 220行目: | ||
auto reply = systemdProxy->callMethod(method); | auto reply = systemdProxy->callMethod(method); | ||
// または、以下に示す方法でもD-Busサービスを実行することができる | |||
//systemdProxy->callMethod("StartUnit") | |||
// .onInterface("org.freedesktop.systemd1.Manager") | |||
// .withArguments("smb.service", "replace"); | |||
// Systmedサービスでsmb.service (D-Busサービス) を開始する場合は、ジョブ番号の値が返る | |||
sdbus::ObjectPath jobPath; | sdbus::ObjectPath jobPath; | ||
reply >> jobPath; | reply >> jobPath; | ||
std::cout << "StartUnit job path: " << jobPath << std::endl; | std::cout << "StartUnit job path: " << jobPath << std::endl; | ||
// イベントループを開始 | |||
// Systemdサービスはシグナルを送信しないため、今回は使用しない | |||
//while (g_keep_running) { | |||
// connection->processPendingEvent(); | |||
// std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 100[mS]のスリープ | |||
// // これにより、CPUの過剰な使用を避けつつ適度な応答性を維持 | |||
//} | |||
// smb.service (D-Busサービス) が正常に開始されたかどうかを確認する | |||
std::string serviceName = "smb.service"; | std::string serviceName = "smb.service"; | ||
if (checkServiceStatus(*systemdProxy, interfaceName, serviceName)) { | if (checkServiceStatus(*systemdProxy, interfaceName, serviceName)) { | ||
| 223行目: | 258行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
<code>processPendingEvent</code>メソッドの意味を以下に示す。<br> | |||
* イベント処理 | |||
*: D-Busシステムから到着した保留中のイベントを1つ処理する。 | |||
*: これには、受信したシグナルやメソッド呼び出しの応答などが含まれる。 | |||
* ノンブロッキング動作 | |||
*: processPendingEventメソッドは、通常、ノンブロッキングで動作する。 | |||
*: つまり、処理すべきイベントがない場合、即座に制御を返す。 | |||
* シングルイベント処理 | |||
*: 1回の呼び出しで1つのイベントのみを処理する。 | |||
*: 複数のイベントを処理するには、このメソッドを繰り返し呼び出す必要がある。 | |||
<br> | <br> | ||
| 452行目: | 498行目: | ||
<br><br> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C++]] | [[カテゴリ:C++]] | ||