「Qtの基礎 - プロセス」の版間の差分

ナビゲーションに移動 検索に移動
128行目: 128行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== 例 : 通常のプロセス ==
以下の例では、<code>which</code>コマンドを実行して、<code>whoami</code>コマンドが存在しているかどうかを確認している。<br>
<syntaxhighlight lang="c++">
#include <QProcess>
QProcess process;
process.start("which", QStringList() << "whoami");
process.waitForFinished();
// process.exitCode()メソッドの戻り値が0の場合は、whoamiコマンドが存在している
// 0以外の戻り値の場合は、whoamiコマンドは存在していない
auto iRet = process.exitCode();
</syntaxhighlight>
<br>
以下の例では、外部コマンドとして<code>whoami</code>コマンドを実行して、その結果であるユーザ名を取得している。<br>
<syntaxhighlight lang="c++">
#include <QProcess>
// 現在のユーザ名を取得
QProcess process;
process.start("whoami");
process.waitForFinished();
// process.exitCode()メソッドの戻り値が0の場合は、whoamiコマンドが正常に実行されている
// 0以外の戻り値の場合は、whoamiコマンドの実行に失敗している
if (process.exitCode() == 0) {
    QString currentUser = QString(process.readAllStandardOutput()).trimmed();
}
</syntaxhighlight>
<br>
余談ではあるが、Linuxシステムでは、C++の標準ライブラリとPOSIX APIを使用してユーザ名を直接取得することができる。<br>
<syntaxhighlight lang="c">
#include <unistd.h>
#include <pwd.h>
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
if (pw) {
    auto str = QString::fromLocal8Bit(pw->pw_name);
}
</syntaxhighlight>
<br>
このアプロ―チの利点として、以下に示すものが挙げられる。<br>
* 外部コマンドに依存しないため、whoamiコマンドが利用できないシステムでも動作する。
* プロセスの起動オーバーヘッドがないため、より高速である。
* セキュリティの観点からも、外部コマンドを実行するよりも安全である。
<br>
<u>※注意</u><br>
* <u>この方法は、POSIX準拠のシステム (Linuxを含む多くのUnixライクシステム) でのみ動作するため、Windowsでは異なるアプローチが必要となる。</u>
* unistd.hファイルとpwd.hファイルのヘッダファイルを含める必要がある。<br>これらは標準的なPOSIXヘッダであるが、クロスプラットフォーム開発の場合は注意が必要である。
<br><br>
<br><br>


案内メニュー