12,964
回編集
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> | ||