📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の4版が非表示)
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>
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> g_shouldExit(false);
  // std::atomic<bool> g_keep_running(false);
   
   
  // UnitStateChangedシグナルハンドラ
  // UnitStateChangedシグナルハンドラ
  // ただし、Systemdサービスはシグナルを送信しないため、今回は設定しない
  // ただし、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_shouldExit.store(true);
  //        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++]]