QProcess Class
QProcess クラスは、外部プログラムを起動したり、それらと通信したりするために使用されます。詳細...
| ヘッダー: | #include <QProcess> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 継承元: | QIODevice |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- 非推奨のメンバー
- QProcessは、入出力およびネットワークの一部です。
注:このクラスのすべての関数は再入可能です。
パブリック型
| struct | CreateProcessArguments |
(since 6.6) struct | UnixProcessParameters |
| CreateProcessArgumentModifier | |
| enum | ExitStatus { NormalExit, CrashExit } |
| enum | InputChannelMode { ManagedInputChannel, ForwardedInputChannel } |
| enum | ProcessChannel { StandardOutput, StandardError } |
| enum | ProcessChannelMode { SeparateChannels, MergedChannels, ForwardedChannels, ForwardedErrorChannel, ForwardedOutputChannel } |
| enum | ProcessError { FailedToStart, Crashed, Timedout, WriteError, ReadError, UnknownError } |
| enum | ProcessState { NotRunning, Starting, Running } |
(since 6.6) enum class | UnixProcessFlag { CloseFileDescriptors, CreateNewSession, DisconnectControllingTerminal, IgnoreSigPipe, ResetIds, …, DisableCoreDumps } |
| flags | UnixProcessFlags |
パブリック関数
| QProcess(QObject *parent = nullptr) | |
| virtual | ~QProcess() |
| QStringList | arguments() const |
(since 6.0) std::function<void ()> | childProcessModifier() const |
| void | closeReadChannel(QProcess::ProcessChannel channel) |
| void | closeWriteChannel() |
| QProcess::CreateProcessArgumentModifier | createProcessArgumentsModifier() const |
| QProcess::ProcessError | error() const |
| int | exitCode() const |
| QProcess::ExitStatus | exitStatus() const |
(since 6.7) void | failChildProcessModifier(const char *description, int error = 0) |
| QProcess::InputChannelMode | inputChannelMode() const |
| QString | nativeArguments() const |
| QProcess::ProcessChannelMode | processChannelMode() const |
| QProcessEnvironment | processEnvironment() const |
| qint64 | processId() const |
| QString | program() const |
| QByteArray | readAllStandardError() |
| QByteArray | readAllStandardOutput() |
| QProcess::ProcessChannel | readChannel() const |
| void | setArguments(const QStringList &arguments) |
(since 6.0) void | setChildProcessModifier(const std::function<void ()> &modifier) |
| void | setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier) |
| void | setInputChannelMode(QProcess::InputChannelMode mode) |
| void | setNativeArguments(const QString &arguments) |
| void | setProcessChannelMode(QProcess::ProcessChannelMode mode) |
| void | setProcessEnvironment(const QProcessEnvironment &environment) |
| void | setProgram(const QString &program) |
| void | setReadChannel(QProcess::ProcessChannel channel) |
| void | setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate) |
| void | setStandardInputFile(const QString &fileName) |
| void | setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate) |
| void | setStandardOutputProcess(QProcess *destination) |
(since 6.6) void | setUnixProcessParameters(const QProcess::UnixProcessParameters ¶ms) |
(since 6.6) void | setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly) |
| void | setWorkingDirectory(const QString &dir) |
| void | start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) |
| void | start(QIODeviceBase::OpenMode mode = ReadWrite) |
(since 6.0) void | startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite) |
| bool | startDetached(qint64 *pid = nullptr) |
| QProcess::ProcessState | state() const |
(since 6.6) QProcess::UnixProcessParameters | unixProcessParameters() const |
| bool | waitForFinished(int msecs = 30000) |
| bool | waitForStarted(int msecs = 30000) |
| QString | workingDirectory() const |
再実装されたパブリック関数
| virtual qint64 | bytesToWrite() const override |
| virtual void | close() override |
| virtual bool | isSequential() const override |
| virtual bool | open(QIODeviceBase::OpenMode mode = ReadWrite) override |
| virtual bool | waitForBytesWritten(int msecs = 30000) override |
| virtual bool | waitForReadyRead(int msecs = 30000) override |
パブリック・スロット
シグナル
| void | errorOccurred(QProcess::ProcessError error) |
| void | finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit) |
| void | readyReadStandardError() |
| void | readyReadStandardOutput() |
| void | started() |
| void | stateChanged(QProcess::ProcessState newState) |
静的パブリックメンバー
| int | execute(const QString &program, const QStringList &arguments = {}) |
| QString | nullDevice() |
| QStringList | splitCommand(QStringView command) |
| bool | startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr) |
| QStringList | systemEnvironment() |
protected 関数
| void | setProcessState(QProcess::ProcessState state) |
再実装されたプロテクト関数
| virtual qint64 | readData(char *data, qint64 maxlen) override |
詳細な説明
プロセスの実行
プロセスを開始するには、実行したいプログラムの名前とコマンドライン引数を、start() の引数として渡します。引数は、QStringList 内の個別の文字列として指定されます。
あるいは、setProgram() およびsetArguments() を使用してプログラムを実行するように設定し、start() またはopen() を呼び出すこともできます。
たとえば、次のコードスニペットは、引数のリストに「-style」と「fusion」を含む文字列を2つの項目として渡すことで、X11プラットフォーム上でアナログ時計のサンプルをFusionスタイルで実行します。
QObject *parent = new QObject;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);その後、QProcessはStarting 状態に入り、プログラムが起動すると、QProcessはRunning 状態に入り、started()を発行します。
QProcess を使用すると、プロセスをシーケンシャル I/O デバイスとして扱うことができます。QTcpSocket を使用してネットワーク接続にアクセスするのと同じように、プロセスへの書き込みや読み取りを行うことができます。 その後、write() を呼び出すことでプロセスの標準入力に書き込みを行い、read()、readLine()、およびgetChar() を呼び出すことで標準出力を読み取ることができます。QProcessはQIODevice を継承しているため、QXmlReader の入力ソースとして、あるいはQNetworkAccessManager を使用してアップロードするデータを生成するためにも使用できます。
プロセスが終了すると、QProcessはNotRunning 状態(初期状態)に戻り、finished()を発火します。
finished() シグナルは、プロセスの終了コードと終了ステータスを引数として提供します。また、exitCode() を呼び出して最後に終了したプロセスの終了コードを取得したり、exitStatus() を呼び出してその終了ステータスを取得したりすることもできます。任意の時点でエラーが発生した場合、QProcess はerrorOccurred() シグナルを発行します。 また、error() を呼び出して最後に発生したエラーの種類を確認したり、state() を呼び出して現在のプロセス状態を確認したりすることもできます。
注:QProcessは 、VxWorks、iOS、tvOS、watchOSではサポートされていません。
実行ファイルの検索
実行するプログラムは、setProgram() を呼び出すか、start() の呼び出し内で直接指定することで設定できます。プログラム名と引数を指定してstart() を呼び出す効果は、その関数の前にsetProgram() およびsetArguments() を呼び出し、その後それらのパラメータを省略してオーバーロードを呼び出すことと同等です。
QProcess は、Unix シェルや Windows コマンドインタプリタがそれぞれのコマンドラインで動作するのと同様に、プログラム名を 3 つの異なる方法のいずれかで解釈します。
- プログラム名が絶対パスである場合、そのパスが指定された実行ファイルそのものであり、QProcess による検索は行われません。
- プログラム名が複数のパスコンポーネントを持つ相対パス(つまり、少なくとも1つのスラッシュを含む)である場合、その相対パスの検索が開始されるディレクトリはOSに依存します。Windowsでは親プロセスの現在の作業ディレクトリですが、UnixではsetWorkingDirectory()で設定されたディレクトリになります。
- プログラム名がスラッシュを含まない単純なファイル名の場合、その動作はオペレーティングシステムに依存します。Unix システムでは、QProcess は
PATH環境変数を参照して検索を行います。Windows では、検索は OS によって行われ、まず親プロセスのカレントディレクトリが検索され、その後PATH環境変数が参照されます(完全なリストについては、CreateProcessのドキュメントを参照してください)。
プラットフォームに依存する動作や、現在のアプリケーションの起動方法に起因する問題を回避するため、起動する実行ファイルへの絶対パスを常に渡すことが推奨されます。 アプリケーションに同梱されている補助バイナリについては、QCoreApplication::applicationDirPath() で始まるようなパスを構築することができます。同様に、setWorkingDirectory() で設定されたディレクトリを基準として相対パスで実行される実行ファイルを明示的に実行するには、状況に応じて "./" または "../" で始まるプログラムパスを使用してください。
Windows では、CreateProcessのドキュメントに記載されている場合を除き、ほとんどの用途で ".exe" という拡張子は必要ありません。さらに、QProcess はプログラム名に含まれる Unix 形式のスラッシュを、Windows パス形式のバックスラッシュに変換します。これにより、上記の例に示すように、QProcess を使用するコードをクロスプラットフォームに対応した形で記述することが可能になります。
QProcess は、cmd.exe の `dir ` コマンドや Bourne シェルの `export` など、Unix シェルや Windows コマンドインタプリタの組み込み関数を直接実行することはサポートしていません。Unix では、多くのシェル組み込みコマンドが個別の実行ファイルとしても提供されていますが、その動作は組み込みとして実装されているものとは異なる場合があります。 これらのコマンドを実行するには、適切なオプションを指定してインタプリタを明示的に実行する必要があります。 Unix システムの場合は、「/bin/sh」を 2 つの引数(「-c」と、実行するコマンドラインを含む文字列)とともに起動します。Windows の場合、cmd.exe がコマンドラインを解析する方法が非標準であるため、setNativeArguments() を使用します(例:「/c dir d:」)。
環境変数
QProcess API には、子プロセスが認識する環境変数を操作するためのメソッドが用意されています。デフォルトでは、子プロセスは、start() 関数が呼び出された時点で存在する現在のプロセスの環境変数のコピーを受け取ります。つまり、その呼び出しの前にqputenv() を使用して行われた変更は、すべて子プロセスの環境に反映されます。 なお、QProcessは、他のスレッドで実行されるqputenv()とのレースコンディションを防ぐようには設計されていないため、アプリケーションの初回起動後はqputenv()の使用を避けることを推奨します。
特定の子プロセスの環境は、QProcessEnvironment クラスを使用するprocessEnvironment() およびsetProcessEnvironment() 関数を使用して変更できます。デフォルトでは、processEnvironment() はQProcessEnvironment::inheritsFromParent() が true となるオブジェクトを返します。親から継承しない環境を設定すると、QProcess はその子プロセスが起動される際に、まさにその環境を使用することになります。
一般的なシナリオでは、QProcessEnvironment::systemEnvironment() を呼び出して現在の環境から開始し、その後、特定の変数の追加、変更、または削除を行います。その結果得られた変数リストは、setProcessEnvironment() を使用して QProcess に適用できます。
QProcessEnvironment()のデフォルトコンストラクタを使用することで、環境からすべての変数を削除したり、空の環境から開始したりすることが可能です。ただし、現在のプロセス環境に設定されており、子プロセスの正常な実行に必要となるシステム変数が存在する場合があるため、制御された環境やシステム固有の条件以外では、この方法は推奨されません。
Windows では、QProcess は、"PATH" および"SystemRoot" の環境変数が設定されていない場合、それらを現在のプロセスからコピーします。これらを完全に解除することはできませんが、空の値に設定することは可能です。Windows で"PATH" を空に設定すると、子プロセスの起動に失敗する可能性があります。
チャネルを介した通信
プロセスには 2 つの定義済み出力チャネルがあります。標準出力チャネル (stdout) は通常のコンソール出力を提供し、標準エラーチャネル (stderr) は通常、プロセスによって出力されるエラーを提供します。これらのチャネルは、2 つの独立したデータストリームを表しています。setReadChannel()を呼び出すことで、これらを切り替えることができます。QProcessは、現在の読み取りチャネルにデータがある場合にreadyRead()を発行します。また、新しい標準出力データがある場合にはreadyReadStandardOutput()を発行し、新しい標準エラーデータがある場合にはreadyReadStandardError()を発行します。read()、readLine()、またはgetChar() を呼び出す代わりに、readAllStandardOutput() またはreadAllStandardError() を呼び出すことで、2つのチャネルのいずれかからすべてのデータを明示的に読み取ることができます。
チャネルに関する用語は誤解を招きやすい場合があります。プロセスの出力チャネルは QProcessの読み取りチャネルに対応し、プロセスの入力チャネルは QProcessの書き込みチャネルに対応することに注意してください。これは、QProcess を使用して読み取るものはプロセスの出力であり、書き込むものはプロセスの入力となるためです。
QProcessは2つの出力チャネルを統合できるため、実行中のプロセスからの標準出力と標準エラーのデータは、どちらも標準出力チャネルを使用するようになります。この機能を有効にするには、プロセスを開始する前に、MergedChannels を引数としてsetProcessChannelMode()を呼び出してください。 また、引数としてForwardedChannels を指定することで、実行中のプロセスの出力を呼び出し元のメインプロセスに転送するオプションもあります。出力チャネルのうち一方のみを転送することも可能です。通常はForwardedErrorChannel を使用しますが、ForwardedOutputChannel も存在します。なお、GUIアプリケーションにおいてチャネル転送を使用することは一般的に推奨されません。エラーは代わりにグラフィカルに表示すべきです。
一部のプロセスは、動作するために特別な環境設定を必要とします。setProcessEnvironment() を呼び出すことで、プロセス用の環境変数を設定できます。作業ディレクトリを設定するには、setWorkingDirectory() を呼び出します。デフォルトでは、プロセスは呼び出し元のプロセスの現在の作業ディレクトリで実行されます。
QProcess で起動された GUI アプリケーションに属するウィンドウの位置や画面上の Z 順序は、基盤となるウィンドウシステムによって制御されます。Qt 5 アプリケーションの場合、-qwindowgeometry コマンドラインオプションを使用して位置を指定できます。X11 アプリケーションは、一般的に-geometry コマンドラインオプションを受け付けます。
同期プロセスAPI
QProcess は、特定のシグナルが発信されるまで呼び出しスレッドを一時停止させることで、イベントループを使用せずに利用可能にする一連の関数を提供しています:
- waitForStarted() は、プロセスが起動するまでブロックします。
- waitForReadyRead() は、現在の読み取りチャネルで新しいデータが読み取り可能になるまでブロックします。
- waitForBytesWritten() は、1 つのデータペイロードがプロセスに書き込まれるまでブロックします。
- waitForFinished() は、プロセスが終了するまでブロックします。
メインスレッド(QApplication::exec() を呼び出すスレッド)からこれらの関数を呼び出すと、ユーザーインターフェースがフリーズする可能性があります。
次の例は、イベントループを使用せずに、gzip を実行して文字列「Qt rocks!」を圧縮するものです。
QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
return false;
gzip.write("Qt rocks!");
gzip.closeWriteChannel();
if (!gzip.waitForFinished())
return false;
QByteArray result = gzip.readAll();セキュリティに関する考慮事項
プログラム名、引数、環境、および作業ディレクトリは、それらが信頼できないソース(ネットワーク、信頼できないファイル、他のユーザーが制御するアプリケーション)から提供された場合は、常に悪意のある入力として扱ってください。QProcess が起動するプロセスは、呼び出し元のアプリケーションの完全な権限で実行されます。
プログラム名の解決
可能であれば、プログラム名として絶対パスを指定してください。単純なファイル名は、Unix では `PATH ` 環境変数を通じて、Windows ではオペレーティングシステムの検索順序(歴史的に、現在のディレクトリおよび `PATH` が含まれます)によって解決されるため、PATH を改ざんしたり、検索対象のディレクトリにファイルを配置したりできる攻撃者は、どのバイナリを実行するかを選択できます。 バイナリ検索プロセスの詳細については、Finding the Executable を参照してください。
引数の扱い
引数は、start() またはsetArguments() を通じて個別のリスト要素として渡してください。信頼できない部分から単一のコマンド文字列を組み立てることは絶対に避けてください。Unix では、引数はシェルを介さずに個別のargv エントリとしてそのまま子プロセスに渡されるため、& 、| 、; 、$ などの文字は特別な意味を持ちません。 Windows では、QProcess は Win32 関数CommandLineToArgvW() で規定されたルールに従って、引数を適切に引用符で囲み、エスケープ処理を行います。いずれの OS においても、QProcess は自動的にシェルを使用することはありません。
splitCommand() およびstartCommand() を使用する際は、これらの関数のトークン化およびエスケープのルールが、Windows および POSIX シェルのものとは異なる点に注意してください。不適切にエスケープされた入力は、引数インジェクションの可能性を招きます。
シェルおよびバッチファイルの実行
Windowsでは、信頼できない引数をバッチファイル(.bat または.cmd )やcmd.exe に渡さないでください。代わりに、setNativeArguments()を使用し、自分で引用符で囲んだりエスケープ処理を行ったりすることを推奨します。QProcessはCommandLineToArgvW() のルールに従って引数を引用符で囲みますが、cmd.exe はコマンドラインの解析方法が異なり、シェルのメタ文字である% 、^ 、& 、| 、< 、> 、( 、および) をエスケープせずに受け取ります。 したがって、args&calc.exe のような引数が.cmd スクリプトに渡されると、calc.exe が 2 番目のコマンドとして実行されてしまいます。Windows では、すべての引数が内部で 1 つのコマンドライン文字列に結合されるため、process.start("file.cmd", {"args", "&calc.exe"}) のように引数を個別に渡しても問題は解決しないことに注意してください。多くのツールはバッチスクリプトをインストールします(例:npm 、yarn 、またはgradle のラッパーなど)。そのため、ターゲットがバッチファイルであることは見落とされがちです。
Unix では、シェルを明示的に起動する場合(例:process.start("/bin/sh", {"-c", "args&&malicious_binary"}) )にも同様の問題が発生する可能性があります。その場合、QProcess ではなくシェルが-c という文字列を解析し、Windows におけるcmd.exe と同様に、&& 、; 、| 、バッククォート、および$() に通常の意味を付与します。ここでは、末尾の&&malicious_binary がargs の後に 2 つ目のプログラムを実行するため、信頼できない入力から-c という文字列を組み立てることは、コマンドインジェクションとなります。
QBuffer 、QFile 、およびQTcpSocketも参照してください 。
メンバ型のドキュメント
QProcess::CreateProcessArgumentModifier
注:この typedef は、デスクトップ版の Windows でのみ利用可能です。
Windows では、QProcess は Win32 API 関数 `CreateProcess ` を使用して子プロセスを起動します。`QProcess ` を使用すれば、プラットフォームの詳細を気にすることなくプロセスを起動できますが、場合によっては `CreateProcess` に渡されるパラメータを微調整したいこともあります。これを行うには、CreateProcessArgumentModifier 関数を定義し、それを `setCreateProcessArgumentsModifier` に渡します。
CreateProcessArgumentModifier 関数は、1つのパラメータ(CreateProcessArguments 構造体へのポインタ)を受け取ります。この構造体のメンバは、CreateProcessArgumentModifier 関数が呼び出された後、CreateProcess に渡されます。
以下の例は、CreateProcess にカスタムフラグを渡す方法を示しています。コンソールプロセス A からコンソールプロセス B を起動する場合、QProcess はデフォルトでプロセス A のコンソールウィンドウをプロセス B で再利用します。この例では、代わりに子プロセス B 用に、カスタムカラースキームを持つ新しいコンソールウィンドウが作成されます。
QProcess process;
process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)
{
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
| FOREGROUND_INTENSITY;
});
process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");QProcess::CreateProcessArguments およびsetCreateProcessArgumentsModifier()も参照してください 。
enum QProcess::ExitStatus
この列挙型は、QProcess のさまざまな終了ステータスを表します。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::NormalExit | 0 | プロセスが正常に終了しました。 |
QProcess::CrashExit | 1 | プロセスがクラッシュしました。 |
関連項目: exitStatus()。
enum QProcess::InputChannelMode
この列挙型は、QProcess のプロセス入力チャネルモードを表します。setInputChannelMode() にこれらの値のいずれかを渡すことで、現在の書き込みチャネルモードを設定します。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::ManagedInputChannel | 0 | QProcess 実行中のプロセスの入力を管理します。これは、QProcess のデフォルトの入力チャネルモードです。 |
QProcess::ForwardedInputChannel | 1 | QProcess メインプロセスの入力を実行中のプロセスに転送します。子プロセスは、メインプロセスと同じソースから標準入力を読み取ります。子プロセスの実行中は、メインプロセスが標準入力を読み取ろうとしないように注意してください。 |
setInputChannelMode()も参照してください 。
enum QProcess::ProcessChannel
この列挙型は、実行中のプロセスが使用するプロセスチャネルを表します。setReadChannel() にこれらの値のいずれかを渡すことで、QProcess の現在の読み取りチャネルを設定できます。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::StandardOutput | 0 | 実行中のプロセスの標準出力 (stdout)。 |
QProcess::StandardError | 1 | 実行中のプロセスの標準エラー出力 (stderr)。 |
setReadChannel()も参照してください 。
enum QProcess::ProcessChannelMode
この列挙型は、QProcess のプロセス出力チャネルモードを表します。setProcessChannelMode() にこれらの値のいずれかを渡すことで、現在の読み取りチャネルモードを設定します。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::SeparateChannels | 0 | QProcess 実行中のプロセスの出力を管理し、標準出力と標準エラーのデータを別々の内部バッファに保持します。setReadChannel() を呼び出すことで、QProcess の現在の読み取りチャネルを選択できます。これはQProcess のデフォルトのチャネルモードです。 |
QProcess::MergedChannels | 1 | QProcess 実行中のプロセスの出力を標準出力チャネル(stdout )に統合します。標準エラーチャネル(stderr )にはデータが送信されません。実行中のプロセスの標準出力と標準エラーのデータは交互に混在して出力されます。分離されたプロセスの場合、実行中のプロセスの統合された出力はメインプロセスに転送されます。 |
QProcess::ForwardedChannels | 2 | QProcess 実行中のプロセスの出力をメインプロセスに転送します。子プロセスが標準出力および標準エラーに出力する内容はすべて、メインプロセスの標準出力および標準エラーに書き込まれます。 |
QProcess::ForwardedErrorChannel | 4 | QProcess 実行中のプロセスの標準出力を管理しますが、その標準エラーをメインプロセスに転送します。これは、標準出力を別のプロセスやファイルにリダイレクトし、標準エラーは診断目的でコンソールに出力するという、コマンドラインツールをフィルタとして使用する典型的な使用法を反映しています。(この値は Qt 5.2 で導入されました。) |
QProcess::ForwardedOutputChannel | 3 | ForwardedErrorChannel を補完するものです。(この値は Qt 5.2 で導入されました。) 注:Windows では 、GUI 専用アプリケーションからの出力が継承されたコンソールへ送信されないよう意図的に抑制されています。これは、ファイルやパイプにリダイレクトされた出力には適用されません。それでも GUI 専用アプリケーションの出力をコンソールに転送するには、`SeparateChannels` を使用し、出力を読み取って適切な出力チャネルに書き込むことで、自身で転送処理を行う必要があります。 |
関連項目: ` setProcessChannelMode()`。
enum QProcess::ProcessError
この列挙型は、QProcess によって報告されるさまざまな種類のエラーを表します。
| 定数 | 定数値 | 説明 |
|---|---|---|
QProcess::FailedToStart | 0 | プロセスの起動に失敗しました。呼び出されたプログラムが存在しないか、またはプログラムを呼び出すための権限やリソースが不足している可能性があります。 |
QProcess::Crashed | 1 | プロセスは正常に起動した後、しばらくしてクラッシュしました。 |
QProcess::Timedout | 2 | 最後の waitFor...() 関数がタイムアウトしました。QProcess の状態は変更されていないため、waitFor...() を再度呼び出すことができます。 |
QProcess::WriteError | 4 | プロセスへの書き込みを試みた際にエラーが発生しました。たとえば、プロセスが実行されていないか、入力チャネルが閉じられている可能性があります。 |
QProcess::ReadError | 3 | プロセスからの読み取り中にエラーが発生しました。たとえば、プロセスが実行されていない可能性があります。 |
QProcess::UnknownError | 5 | 不明なエラーが発生しました。これはerror() のデフォルトの戻り値です。 |
error()も参照してください 。
enum QProcess::ProcessState
この列挙型は、QProcess のさまざまな状態を表します。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::NotRunning | 0 | プロセスは実行されていません。 |
QProcess::Starting | 1 | プロセスは起動中ですが、プログラムはまだ呼び出されていません。 |
QProcess::Running | 2 | プロセスは実行中であり、読み取りおよび書き込みの準備ができています。 |
state()も参照してください 。
[since 6.6] enum class QProcess::UnixProcessFlag
flags QProcess::UnixProcessFlags
これらのフラグは、UnixProcessParameters の「flags 」フィールドで使用できます。
| 定数 | 値 | 説明 |
|---|---|---|
QProcess::UnixProcessFlag::CloseFileDescriptors | 0x0010 | lowestFileDescriptorToClose で定義された閾値を超えるすべてのファイル記述子を閉じ、親プロセスで現在開かれている記述子が誤って子プロセスにリークするのを防ぎます。stdin 、stdout 、およびstderr のファイル記述子は決して閉じられません。 |
QProcess::UnixProcessFlag::CreateNewSession (since Qt 6.7) | 0x0040 | setsid(2) を呼び出すことで、新しいプロセスセッションを開始します。これにより、子プロセスは現在のプロセスが属するセッションよりも長く存続できるようになります。これは、startDetached() がプロセスの切り離しを可能にするために実行する手順の一つであり、プロセスをデーモン化するための手順の一つでもあります。 |
QProcess::UnixProcessFlag::DisconnectControllingTerminal (since Qt 6.7) | 0x0080 | プロセスが制御端末を持っている場合、その端末から切断するよう要求します。制御端末がない場合は、何も起こりません。制御端末にまだ接続されているプロセスは、端末が閉じられた場合、Hang Up (SIGHUP) シグナル、あるいはその他の端末制御シグナル (SIGTSTP 、SIGTTIN 、SIGTTOU) のいずれかを受け取る可能性があります。 一部のオペレーティングシステムでは、プロセスが制御端末から切断できるのは、そのプロセスがセッションリーダーである場合に限られることに注意してください。つまり、CreateNewSession フラグが必要になる場合があります。これと同様に、これはプロセスをデーモン化する手順の一つです。 |
QProcess::UnixProcessFlag::IgnoreSigPipe | 0x0002 | ResetSignalHandlers フラグが設定されていた場合でも、常にSIGPIPE シグナルを無視するように設定します(SIG_IGN )。デフォルトでは、QProcess::closeReadChannel()によって標準出力または標準エラー出力チャネルが閉じられた後、子プロセスがそれらのチャネルへの書き込みを試みると、SIGPIPE シグナルを受け取り、直ちに終了します。このフラグを指定すると、書き込み操作はシグナルを発することなく失敗し、子プロセスは実行を継続できます。 |
QProcess::UnixProcessFlag::ResetIds (since Qt 6.7) | 0x0100 | 現在のプロセスがまだ保持している可能性のある、保持された実効ユーザーIDまたは実効グループIDをすべて破棄します(setuid(2) 、setgid(2) 、およびQCoreApplication::setSetuidAllowed()を参照)。これは、現在のプロセスがsetuidまたはsetgidに設定されており、子プロセスに昇格された権限を保持させたくない場合に役立ちます。 |
QProcess::UnixProcessFlag::ResetSignalHandlers | 0x0001 | すべてのUnixシグナルハンドラをデフォルトの状態にリセットします(つまり、SIG_DFL をsignal(2) に渡しします)。このフラグは、無視された(SIG_IGN )シグナルが子プロセスの動作に影響を与えないようにするために有用です。 |
QProcess::UnixProcessFlag::UseVFork | 0x0020 | QProcess がvfork(2) を使用して子プロセスを起動することを要求します。このフラグは、setChildProcessModifier()で設定されたコールバック関数が、vfork(2) の子プロセス側で安全に実行可能であることを示すために使用します。つまり、そのコールバック関数は(直接、あるいは呼び出す関数を通じて)非局所変数を変更せず、親プロセスとの通信を試みないことを意味します。QProcess が実際にvfork(2) を使用するか、またvfork(2) が標準のfork(2) と異なるかどうかは、実装に依存します。 |
QProcess::UnixProcessFlag::DisableCoreDumps (since Qt 6.9) | 0x0200 | QProcess に対し、子プロセスでのコアダンプを無効にするよう要求します。これは、実行中の実行ファイルがクラッシュする可能性が高いものの、ユーザーや保守担当者がそのような状況でのバグレポートの作成に関心を持たない場合(例えば、実行ファイルがテストプロセスである場合など)に有用です。 この設定は、クラッシュしたプロセスのexitStatus()には影響しません。これは、コアダンプサイズのリソースのソフトリミットをゼロに設定することで実装されており、つまり、アプリケーションはこれをハードリミットまでの値に引き上げることで、この変更を元に戻すことができます。 |
この列挙型は Qt 6.6 で導入されました。
UnixProcessFlags 型は、QFlags<UnixProcessFlag> の typedef です。これは、UnixProcessFlag 値の論理和(OR)を格納します。
setUnixProcessParameters() およびunixProcessParameters()も参照してください 。
メンバ関数のドキュメント
[explicit] QProcess::QProcess(QObject *parent = nullptr)
指定されたparent を使用して、QProcessオブジェクトを生成します。
[virtual noexcept] QProcess::~QProcess()
QProcess オブジェクトを破棄します。つまり、プロセスを終了させます。
この関数は、プロセスが終了するまで戻り値を出さないことに注意してください。
QStringList QProcess::arguments() const
そのプロセスが最後に起動された際のコマンドライン引数を返します。
setArguments() およびstart()も参照してください 。
[override virtual] qint64 QProcess::bytesToWrite() const
QIODevice::bytesToWrite() const を再実装します。
[since 6.0] std::function<void ()> QProcess::childProcessModifier() const
setChildProcessModifier() の呼び出しによって以前に設定された修飾関数を返します。
注:この関数は 、Unixプラットフォームでのみ利用可能です。
この関数は Qt 6.0 で導入されました。
関連項目: setChildProcessModifier() およびunixProcessParameters()。
[override virtual] void QProcess::close()
QIODevice::close() の再実装。
プロセスとのすべての通信を閉じ、プロセスを強制終了します。この関数を呼び出した後、QProcess はreadyRead() を発行しなくなり、データの読み書きもできなくなります。
void QProcess::closeReadChannel(QProcess::ProcessChannel channel)
読み取りチャネル `channel` を閉じます。この関数を呼び出した後、QProcess はこのチャネルからデータを受信しなくなります。すでに受信済みのデータは、引き続き読み取ることができます。
プロセスの出力に関心がない場合は、メモリを節約するためにこの関数を呼び出してください。
closeWriteChannel() およびsetReadChannel()も参照してください 。
void QProcess::closeWriteChannel()
QProcess の書き込みチャネルを閉じるようスケジュールします。チャネルは、プロセスへのデータの書き込みがすべて完了すると閉じられます。この関数を呼び出した後、そのプロセスへの書き込みを試みても失敗します。
書き込みチャネルの閉じる処理は、チャネルが閉じられるまで入力データを読み込むプログラムでは必要です。例えば、プログラム「more」は、Unix および Windows の両方でコンソールにテキストデータを表示するために使用されます。しかし、QProcess の書き込みチャネルが閉じられるまでは、テキストデータは表示されません。例:
QProcess more;
more.start("more");
more.write("Text to display");
more.closeWriteChannel();
// QProcess will emit readyRead() once "more" starts printingstart() が呼び出されると、書き込みチャネルは暗黙的に開かれます。
closeReadChannel()も参照してください 。
QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier() const
以前に設定されたCreateProcess 修飾関数を返します。
注:この関数は Windows プラットフォームでのみ利用可能です。
関連項目: setCreateProcessArgumentsModifier() およびQProcess::CreateProcessArgumentModifier 。
QProcess::ProcessError QProcess::error() const
最後に発生したエラーのタイプを返します。
state()も参照してください 。
[signal] void QProcess::errorOccurred(QProcess::ProcessError error)
このシグナルは、プロセスでエラーが発生した際に発信されます。指定されたerror は、発生したエラーの種類を表します。
[static] int QProcess::execute(const QString &program, const QStringList &arguments = {})
引数arguments を指定してプログラムprogram を新しいプロセスで起動し、その終了を待った後、そのプロセスの終了コードを返します。新しいプロセスがコンソールに書き込んだデータはすべて、呼び出し元プロセスに転送されます。
環境変数および作業ディレクトリは、呼び出し元プロセスから継承されます。
引数の処理は、対応するstart() のオーバーロードと同一です。
プロセスを起動できない場合は -2 が返されます。プロセスがクラッシュした場合は -1 が返されます。それ以外の場合は、プロセスの終了コードが返されます。
start()も参照してください 。
int QProcess::exitCode() const
最後に終了したプロセスの終了コードを返します。
exitStatus() がNormalExit を返さない限り、この値は無効です。
QProcess::ExitStatus QProcess::exitStatus() const
最後に終了したプロセスの終了ステータスを返します。
Windows では、プロセスが別のアプリケーションから TerminateProcess() によって終了された場合でも、終了コードが 0 未満でない限り、この関数はNormalExit を返します。
[noexcept, since 6.7] void QProcess::failChildProcessModifier(const char *description, int error = 0)
この関数は、setChildProcessModifier() を使用して、エラー状態が発生したことを示すために、モディファイアセット内で使用できます。モディファイアがこれらの関数を呼び出すと、QProcess は親プロセスにおいてコードQProcess::FailedToStart を伴うerrorOccurred()を発行します。description を使用すると、errorString()に問題の診断に役立つ情報を含めることができます。通常は、Cライブラリ関数perror() と同様に、失敗した呼び出しの名前が指定されます。さらに、error パラメータには<errno.h> のエラーコードを指定でき、そのテキスト形式も含まれます。
例えば、子プロセスのモディファイアは、次のようにして子プロセス用に追加のファイルディスクリプタを準備できます。
process.setChildProcessModifier([fd, &process]() {
if (dup2(fd, TargetFileDescriptor) < 0)
process.failChildProcessModifier(errno, "aux comm channel");
});
process.start();ここで、fd は親プロセスで現在開かれているファイル記述子です。dup2() システムコールがEBADF 状態となった場合、プロセスerrorString()は「子プロセス修飾子がエラーを報告しました: aux comm channel: 不正なファイル記述子」となる可能性があります。
この関数は呼び出し元に戻りません。子プロセス修飾子以外で、かつ正しいQProcess オブジェクトを使用せずにこの関数を使用することは、未定義の挙動となります。
注:実装上、 description パラメータの長さには約500文字の制限が設けられています。これには、error コード内のテキストは含まれません。
この関数は Qt 6.7 で導入されました。
setChildProcessModifier() およびsetUnixProcessParameters()も参照してください 。
[signal] void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)
このシグナルは、プロセスが終了したときに発信されます。exitCode はプロセスの終了コード(正常終了の場合のみ有効)であり、exitStatus は終了ステータスです。プロセスが終了した後も、QProcess 内のバッファはそのまま残ります。プロセスが終了する前に書き込んだデータは、引き続き読み取ることができます。
exitStatus()も参照してください 。
QProcess::InputChannelMode QProcess::inputChannelMode() const
QProcess の標準入力チャネルのモードを返します。
setInputChannelMode() およびInputChannelModeも参照してください 。
[override virtual] bool QProcess::isSequential() const
QIODevice::isSequential() const を再実装します。
[slot] void QProcess::kill()
現在のプロセスを強制終了させ、直ちに終了させます。
Windows では、kill() は TerminateProcess を使用し、Unix および macOS では、プロセスに SIGKILL シグナルが送信されます。
terminate()も参照してください 。
QString QProcess::nativeArguments() const
プログラムの追加のネイティブコマンドライン引数を返します。
注:この関数は Windows プラットフォームでのみ利用可能です。
関連項目: setNativeArguments()。
[static] QString QProcess::nullDevice()
オペレーティングシステムのヌルデバイス。
返されるファイルパスには、ネイティブなディレクトリ区切り文字が使用されます。
QProcess::setStandardInputFile()、QProcess::setStandardOutputFile()、およびQProcess::setStandardErrorFile()も参照してください 。
[override virtual] bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite)
QIODevice::open (QIODeviceBase::OpenMode mode)を再実装します。
setProgram() で設定されたプログラムを、setArguments() で設定された引数とともに起動します。OpenMode はmode に設定されます。
このメソッドはstart() の別名であり、QIODevice で定義されたインターフェースを完全に実装するためにのみ存在します。
プログラムが起動済みの場合は、true を返します。
start()、setProgram()、およびsetArguments()も参照してください 。
QProcess::ProcessChannelMode QProcess::processChannelMode() const
QProcess の標準出力および標準エラーチャネルのモードを返します。
setProcessChannelMode()、ProcessChannelMode 、およびsetReadChannel()も参照してください 。
QProcessEnvironment QProcess::processEnvironment() const
QProcess が子プロセスに渡す環境を返します。setProcessEnvironment() を使用して環境が設定されていない場合、このメソッドは、親プロセスから環境を継承することを示すオブジェクトを返します。
setProcessEnvironment()、QProcessEnvironment::inheritsFromParent()、およびEnvironment variablesも参照してください 。
qint64 QProcess::processId() const
実行中のプロセスのネイティブプロセス識別子(利用可能な場合)を返します。現在実行中のプロセスがない場合は、0 が返されます。
QString QProcess::program() const
そのプロセスが最後に起動された際のプログラムを返します。
setProgram() およびstart()も参照してください 。
QByteArray QProcess::readAllStandardError()
現在の読み取りチャネルに関係なく、この関数は、プロセスの標準エラーから利用可能なすべてのデータをQByteArray として返します。
readyReadStandardError()、readAllStandardOutput()、readChannel()、およびsetReadChannel()も参照してください 。
QByteArray QProcess::readAllStandardOutput()
現在の読み取りチャネルに関係なく、この関数は、プロセスの標準出力から利用可能なすべてのデータをQByteArray として返します。
readyReadStandardOutput()、readAllStandardError()、readChannel()、およびsetReadChannel()も参照してください 。
QProcess::ProcessChannel QProcess::readChannel() const
QProcess の現在の読み取りチャネルを返します。
setReadChannel()も参照してください 。
[override virtual protected] qint64 QProcess::readData(char *data, qint64 maxlen)
QIODevice::readData (char *data, qint64 maxSize)を再実装します。
[private signal] void QProcess::readyReadStandardError()
このシグナルは、プロセスが標準エラーチャネル(stderr )を通じて新しいデータを提供可能にしたときに発信されます。これは、現在のread channel の設定にかかわらず発信されます。
注:これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが発行することはできません。
readAllStandardError() およびreadChannel()も参照してください 。
[private signal] void QProcess::readyReadStandardOutput()
このシグナルは、プロセスが標準出力チャネル(stdout )を通じて新しいデータを送信した際に発信されます。これは、現在のread channel の設定にかかわらず発信されます。
注:これは プライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発信することはできません。
readAllStandardOutput() およびreadChannel()も参照してください 。
void QProcess::setArguments(const QStringList &arguments)
プロセスの起動時に、呼び出されるプログラムに渡すarguments を設定します。この関数は、start()を呼び出す前に呼び出す必要があります。
start()、setProgram()、およびarguments()も参照してください 。
[since 6.0] void QProcess::setChildProcessModifier(const std::function<void ()> &modifier)
Unixシステム(macOSを含む。WindowsについてはsetCreateProcessArgumentsModifier()を参照)において、子プロセス用のmodifier 関数を設定します。modifier 引数で指定された関数は、fork() またはvfork() が完了し、QProcess によって子プロセスの標準ファイル記述子が設定された後、execve() が実行される前の、start()内の時点で、子プロセス内で呼び出されます。
以下に、特権なしで実行される子プロセスを設定する例を示します。
void runSandboxed(const QString &name, const QStringList &arguments)
{
QProcess proc;
proc.setChildProcessModifier([] {
// Drop all privileges in the child process, and enter
// a chroot jail.
::setgroups(0, nullptr);
::chroot("/run/safedir");
::chdir("/");
::setgid(safeGid);
::setuid(safeUid);
::umask(077);
});
proc.start(name, arguments);
proc.waitForFinished();
}修飾関数が失敗状態に陥った場合、failChildProcessModifier() を使用して、QProcess を呼び出した側へ状況を報告することができます。あるいは、_exit() やabort() といった、プロセスを停止させる他の方法を使用することも可能です。
子プロセスの特定のプロパティ(余分なファイルディスクリプタのすべてを閉じたり、制御用 TTY から切断したりすることなど)は、setUnixProcessParameters() を使用することでより容易に実現できます。この関数は、障害を検出し、FailedToStart 状態を報告することができます。 この修飾子は、追加のファイル記述子の設定など、子プロセスの特定の珍しい特性を変更するのに役立ちます。子プロセス修飾子と Unix プロセスパラメータの両方が設定されている場合、これらのパラメータが適用される前に修飾子が実行されます。
注:マルチスレッドアプリケーションでは 、この関数では、他のスレッドで使用されている可能性のあるミューテックスをロックする関数を呼び出さないよう注意する必要があります(一般に、POSIX で「async-signal-safe」と定義されている関数のみを使用することをお勧めします)。qDebug() を含め、このコールバック内では Qt API の大部分が安全ではなく、デッドロックを引き起こす可能性があります。
注: setUnixProcessParameters() を通じて UnixProcessParameters::UseVFork フラグが設定されている場合 、QProcess はvfork() のセマンティクスを使用して子プロセスを起動することがあるため、この関数はさらに厳しい制約に従わなければなりません。 第一に、親プロセスと依然としてメモリを共有しているため、データ競合を避けるために、非ローカル変数への書き込みを行ってはならず、それらから読み取る際には適切な順序のセマンティクスを遵守しなければなりません。 第二に、さらに多くのライブラリ関数が予期せぬ動作をする可能性があるため、この関数では、read() 、write() 、setsid() 、nice() などの低レベルのシステムコールのみを使用する必要があります。
この関数は Qt 6.0 で導入されました。
childProcessModifier()、failChildProcessModifier()、およびsetUnixProcessParameters()も参照してください 。
void QProcess::setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
CreateProcess のWin32 API呼び出しにおけるmodifier を設定します。以前に設定されたものを削除するには、QProcess::CreateProcessArgumentModifier() を指定します。
注:この関数は Windows プラットフォームでのみ利用可能であり、C++11 が必要です。
関連項目: createProcessArgumentsModifier(),QProcess::CreateProcessArgumentModifier, およびsetChildProcessModifier().
void QProcess::setInputChannelMode(QProcess::InputChannelMode mode)
QProcess の標準入力チャネルのモードを、指定されたmode に設定します。このモードは、次にstart()が呼び出された際に使用されます。
inputChannelMode() およびInputChannelModeも参照してください 。
void QProcess::setNativeArguments(const QString &arguments)
プログラムの追加のネイティブコマンドラインarguments を設定します。
サブプロセスにコマンドラインarguments を渡すためのシステムAPIが、ネイティブに単一の文字列を使用するオペレーティングシステムでは、QProcess のポータブルなリストベースのAPIでは渡せないコマンドラインが考えられます。そのような場合、この関数を使用して、通常の引数リストから構成された文字列の末尾に、区切りとしてスペースを挟んで文字列を追加する必要があります。
注:この関数は Windows プラットフォームでのみ利用可能です。
関連項目: nativeArguments()。
void QProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
QProcess の標準出力および標準エラーチャネルのモードを、指定されたmode に設定します。このモードは、次にstart()が呼び出された際に使用されます。例:
QProcess builder;
builder.setProcessChannelMode(QProcess::MergedChannels);
builder.start("make",QStringList()<< "-j2");
if(!builder.waitForFinished())
qDebug() << "Make failed:" << builder.errorString();
else
qDebug() << "Make output:" << builder.readAll();processChannelMode()、ProcessChannelMode 、およびsetReadChannel()も参照してください 。
void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)
QProcess が子プロセスに渡すenvironment を設定します。
たとえば、次のコードは環境変数TMPDIR を追加します:
QProcess process;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable
process.setProcessEnvironment(env);
process.start("myapp");Windows では、環境変数名は大文字と小文字を区別しない点に注意してください。
processEnvironment()、QProcessEnvironment::systemEnvironment()、およびEnvironment variablesも参照してください 。
[protected] void QProcess::setProcessState(QProcess::ProcessState state)
QProcess の現在の状態を、指定されたstate に設定します。
state()も参照してください 。
void QProcess::setProgram(const QString &program)
プロセスの起動時に使用するprogram を設定します。この関数は、start()を呼び出す前に呼び出す必要があります。
program が絶対パスである場合、起動される実行ファイルが具体的に指定されます。相対パスはプラットフォーム固有の方法で解決され、その際にはPATH 環境変数の検索も含まれます(詳細についてはFinding the Executable を参照してください)。
start()、setArguments()、program()、およびQStandardPaths::findExecutable()も参照してください 。
void QProcess::setReadChannel(QProcess::ProcessChannel channel)
QProcess の現在の読み取りチャンネルを、指定されたchannel に設定します。現在の入力チャンネルは、read()、readAll()、readLine()、およびgetChar()の各関数で使用されます。また、QProcess がreadyRead()を発火させる際のチャンネルもこれにより決定されます。
readChannel()も参照してください 。
void QProcess::setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
プロセスの標準エラー出力をファイル `fileName` にリダイレクトします。リダイレクトが設定されている場合、標準エラー出力の読み取りチャネルは閉じられます。そのため、read() やreadAllStandardError() を使用してそこから読み取ろうとすると、常に失敗します。mode が Append に設定されている場合はファイルに追記され、そうでない場合はファイルの内容が切り捨てられます。
ファイルの開き方に関する詳細については、setStandardOutputFile() を参照してください。
注:setProcessChannelMode() が引数としてQProcess::MergedChannels を指定して呼び出された場合、この関数は何の効果も持ちません。
setStandardInputFile()、setStandardOutputFile()、およびsetStandardOutputProcess()も参照してください 。
void QProcess::setStandardInputFile(const QString &fileName)
プロセスの標準入力を、fileName で指定されたファイルにリダイレクトします。入力リダイレクトが設定されている場合、QProcess オブジェクトは読み取り専用モードになります(write()を呼び出すとエラーが発生します)。
プロセスが直ちにEOFを読み取るようにするには、ここにnullDevice()を渡します。これは、データを書き込む前にcloseWriteChannel()を使用するよりも簡潔です。なぜなら、プロセスの開始前に設定できるからです。
start() が呼び出された時点でfileName というファイルが存在しないか、読み取り不可の場合、プロセスの起動は失敗します。
プロセスの開始後に setStandardInputFile() を呼び出しても、何の効果もありません。
setStandardOutputFile()、setStandardErrorFile()、およびsetStandardOutputProcess()も参照してください 。
void QProcess::setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
プロセスの標準出力をファイル `fileName` にリダイレクトします。リダイレクトが設定されると、標準出力の読み取りチャネルは閉じられます。したがって、read() を使用してそこから読み取ろうとすると常に失敗し、readAllStandardOutput() も同様に失敗します。
プロセスからのすべての標準出力を破棄するには、ここに `nullDevice()` を指定します。これは、単に標準出力を読み取らない場合よりも効率的です。なぜなら、QProcess のバッファが満たされることがないからです。
start() が呼び出された時点でファイルfileName が存在しない場合、そのファイルが作成されます。作成できない場合、処理は失敗します。
ファイルが存在し、かつ `mode ` が `QIODeviceBase::Truncate` である場合、ファイルは切り捨てられます。それ以外の場合(`mode ` が `QIODeviceBase::Append` である場合)、ファイルには末尾から書き込まれます。
プロセスの起動後に setStandardOutputFile() を呼び出しても、何の効果もありません。
fileName が空の文字列の場合、標準出力のリダイレクトを停止します。これは、リダイレクト後に標準出力を復元するのに役立ちます。
setStandardInputFile()、setStandardErrorFile()、およびsetStandardOutputProcess()も参照してください 。
void QProcess::setStandardOutputProcess(QProcess *destination)
このプロセスの標準出力ストリームを、destination プロセスの標準入力にパイプで送ります。
次のシェルコマンド:
command1 | command2QProcess を使用すれば、次のコードで実現できます:
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("command1");
process2.start("command2");[since 6.6] void QProcess::setUnixProcessParameters(const QProcess::UnixProcessParameters ¶ms)
Unix システムにおいて、子プロセスの追加設定およびパラメータを `params` に設定します。この関数を使用すると、QProcess に対し、対象の実行ファイルを起動する前に子プロセスを変更するよう依頼することができます。
この関数を使用すると、不要なファイルディスクリプタのすべてを閉じたり、子プロセスのniceレベルを変更したり、制御用TTYからの接続を切断したりするなど、子プロセスの特定のプロパティを変更することができます。 子プロセスをよりきめ細かく制御したり、その他の方法で変更したりするには、setChildProcessModifier() 関数を使用してください。子プロセス修飾子と Unix プロセスパラメータの両方が設定されている場合、これらのパラメータが適用される前に修飾子が実行されます。
注:この関数は 、Unix プラットフォームでのみ利用可能です。
この関数は Qt 6.6 で導入されました。
unixProcessParameters() およびsetChildProcessModifier()も参照してください 。
[since 6.6] void QProcess::setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly)
Unix システムにおいて、子プロセスの追加設定を `flagsOnly` に設定します。これは、flags フィールドのみが設定されているオーバーロードと同じです。
注:この関数はUnixプラットフォームでのみ利用 可能です。
これはオーバーロードされた関数です。
この関数は Qt 6.6 で導入されました。
unixProcessParameters() およびsetChildProcessModifier()も参照してください 。
void QProcess::setWorkingDirectory(const QString &dir)
作業ディレクトリをdir に設定します。QProcess を実行すると、このディレクトリでプロセスが起動します。デフォルトでは、呼び出し元のプロセスの作業ディレクトリでプロセスが起動します。
workingDirectory() およびstart()も参照してください 。
[static] QStringList QProcess::splitCommand(QStringView command)
文字列 `command ` をトークンのリストに分割し、そのリストを返します。
スペースを含むトークンは二重引用符で囲むことができます。3つの連続した二重引用符は、引用符そのものを表します。
void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
指定されたprogram を新しいプロセスで起動し、arguments 内のコマンドライン引数を渡します。QProcess が実行する実行ファイルをどのように検索するかについては、setProgram()を参照してください。OpenModeはmode に設定されます。引数のさらなる分割は行われません。
QProcess オブジェクトは直ちに「Starting」状態に入ります。プロセスの起動に成功した場合、QProcess はstarted()を発生させます。そうでない場合は、errorOccurred()が発生します。子プロセスを同期的に起動できるプラットフォーム(特にWindows)では、これらのシグナルがこの関数が戻る前に発生し、このQProcess オブジェクトはそれぞれ「QProcess::Running 」状態または「QProcess::NotRunning 」状態に移行することに注意してください。 その他のプラットフォームでは、started() およびerrorOccurred() 信号の発行が遅延します。
waitForStarted() を呼び出して、プロセスが開始された(または開始に失敗した)こと、およびそれらのシグナルが発信されたことを確認してください。プロセスの開始状態がすでにわかっていても、この関数を呼び出しても安全ですが、シグナルが再度発信されることはありません。
Windows:引数は引用符で囲まれ、Windows のCommandLineToArgvW() 関数と互換性のあるコマンドラインに結合されます。コマンドラインの引用符の扱いに関する要件が異なるプログラムの場合は、setNativeArguments() を使用する必要があります。CommandLineToArgvW() のルールに従わない代表的なプログラムとして cmd.exe が挙げられ、その結果、すべてのバッチスクリプトも同様です。
QProcess オブジェクトがすでにプロセスを実行している場合、コンソールに警告が表示されることがありますが、既存のプロセスは影響を受けずに実行を継続します。
注: 子プロセスの起動に成功したとしても 、それはオペレーティングシステムがプロセスの作成に成功し、プロセス ID など、すべてのプロセスが持つリソースを割り当てたことを意味するに過ぎません。子プロセスは、非常に早い段階でクラッシュしたり、その他の理由で失敗したりする可能性があり、その結果、期待される出力が得られない場合があります。ほとんどのオペレーティングシステムでは、これには動的リンクエラーが含まれる場合があります。
関連項目: processId()、started()、waitForStarted()、およびsetNativeArguments()。
void QProcess::start(QIODeviceBase::OpenMode mode = ReadWrite)
setProgram() で指定されたプログラムを、setArguments() で指定された引数とともに起動します。OpenMode はmode に設定されます。
これはオーバーロードされた関数です。
open()、setProgram()、およびsetArguments()も参照してください 。
[since 6.0] void QProcess::startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
コマンド `command ` を新しいプロセスで実行します。OpenMode は `mode` に設定されます。
command は、プログラム名とその引数の両方を含む単一の文字列です。引数は1つ以上のスペースで区切られます。例:
QProcess process;
process.startCommand("del /s *.txt");
// same as process.start("del", QStringList() << "/s" << "*.txt");
//...スペースを含む引数は、新しいプロセスに正しく渡されるように引用符で囲む必要があります。例:
QProcess process;
process.startCommand("dir \"My Documents\"");command 文字列内のリテラルな引用符は、三重引用符で表されます。例:
QProcess process;
process.startCommand("dir \"Epic 12\"\"\" Singles\"");command 文字列が分割され、引用符が解除された後、この関数はstart()と同様に動作します。
サブプロセスにコマンドライン引数を渡すためのシステムAPIが、ネイティブに単一の文字列を使用するオペレーティングシステム(Windows)では、QProcess の移植性の高いリストベースのAPIを介して渡すことができないコマンドラインが存在し得る。このような稀なケースでは、この関数の代わりにsetProgram()およびsetNativeArguments()を使用する必要がある。
この関数は Qt 6.0 で導入されました。
splitCommand() およびstart()も参照してください 。
bool QProcess::startDetached(qint64 *pid = nullptr)
setProgram() で指定されたプログラムを、setArguments() で設定された引数とともに新しいプロセスとして起動し、そこから切り離します。成功した場合はtrue を返し、失敗した場合はfalse を返します。呼び出し元プロセスが終了しても、切り離されたプロセスは影響を受けずに実行を継続します。
Unix:起動されたプロセスは独自のセッションで実行され、デーモンのように動作します。
プロセスは、setWorkingDirectory() で設定されたディレクトリ内で起動されます。workingDirectory() が空の場合、作業ディレクトリは呼び出し元プロセスから継承されます。
関数の実行が成功した場合、*pid には起動されたプロセスのプロセス識別子が設定されます。失敗した場合は -1 が設定されます。子プロセスは予告なく終了し、PID が無効になる場合があることに注意してください。さらに、子プロセスが終了した後、同じ PID が再利用され、まったく別のプロセスによって使用される場合があります。 ユーザーコードでは、この変数を使用する際には注意を払う必要があります。特に、オペレーティングシステムの機能を利用してプロセスを強制終了させる場合は注意が必要です。
startDetached() では、以下のプロパティセッターのみがサポートされています:
- setArguments()
- setCreateProcessArgumentsModifier()
- setNativeArguments()
- setProcessEnvironment()
- setProgram()
- setStandardErrorFile()
- setStandardInputFile()
- setStandardOutputFile()
- setProcessChannelMode(QProcess::MergedChannels)
- setStandardOutputProcess()
- setWorkingDirectory()
QProcess オブジェクトのその他のプロパティはすべて無視されます。
注:呼び出されたプロセスは 、呼び出し元のプロセスのコンソールウィンドウを継承します。コンソール出力を抑制するには、標準出力およびエラー出力を `QProcess::nullDevice()` へリダイレクトしてください。
関連項目: start() およびstartDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)。
[static] bool QProcess::startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr)
引数arguments を指定して、プログラムprogram を新しいプロセスで起動し、そこから分離します。成功した場合はtrue を返し、失敗した場合はfalse を返します。呼び出し元プロセスが終了しても、分離されたプロセスは影響を受けることなく実行を継続します。
引数の扱いは、対応するstart() のオーバーロードと同一です。
プロセスはディレクトリworkingDirectory で起動されます。workingDirectory が空の場合、作業ディレクトリは呼び出し元プロセスから継承されます。
関数の実行が成功した場合、*pid には、起動されたプロセスのプロセス識別子が設定されます。
この関数は、QProcess::startDetached() をオーバーロードします。
start()も参照してください 。
[private signal] void QProcess::started()
このシグナルは、プロセスが起動した際にQProcess によって送信され、state()がRunning を返す際に発生します。
注:これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが発信することはできません。
QProcess::ProcessState QProcess::state() const
プロセスの現在の状態を返します。
stateChanged() およびerror()も参照してください 。
[private signal] void QProcess::stateChanged(QProcess::ProcessState newState)
このシグナルは、QProcess の状態が変化するたびに発火します。newState 引数は、QProcess が変化した後の状態を表します。
注:これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが自ら発信することはできません。
[static] QStringList QProcess::systemEnvironment()
呼び出し元のプロセスの環境を、キー=値のペアのリストとして返します。例:
QStringList environment = QProcess::systemEnvironment();
// environment = {"PATH=/usr/bin:/usr/local/bin",
// "USER=greg", "HOME=/home/greg"}この関数はシステム環境変数をキャッシュしません。したがって、setenv やputenv といった低レベルのCライブラリ関数が呼び出された場合、更新された環境変数のリストを取得することが可能です。
ただし、この関数を繰り返し呼び出すと、環境変数のリストが再構築されることに注意してください。これは、非自明な操作です。
注: 新しいコードでは 、QProcessEnvironment::systemEnvironment() を使用することを推奨します
QProcessEnvironment::systemEnvironment() およびsetProcessEnvironment()も参照してください 。
[slot] void QProcess::terminate()
プロセスの終了を試みます。
この関数を呼び出した結果、プロセスが終了しない場合があります(未保存のファイルなどについてユーザーに確認を求める機会が与えられるため)。
Windows では、terminate() はプロセスのすべてのトップレベルウィンドウに WM_CLOSE メッセージを送信し、その後、プロセス自体のメインスレッドに送信します。Unix および macOS では、SIGTERM シグナルが送信されます。
Windows 上でイベントループを実行していない、あるいはイベントループが WM_CLOSE メッセージを処理していないコンソールアプリケーションは、kill() を呼び出すことによってのみ終了させることができます。
kill()も参照してください 。
[noexcept, since 6.6] QProcess::UnixProcessParameters QProcess::unixProcessParameters() const
Unixシステムにおいて、子プロセスに適用される追加のフラグや設定を記述したUnixProcessParameters オブジェクトを返します。デフォルトの設定は、デフォルトのコンストラクタで生成されたUnixProcessParameters に対応しています。
注:この関数はUnixプラットフォームでのみ利用 可能です。
この関数は Qt 6.6 で導入されました。
関連項目: ` setUnixProcessParameters()` および `childProcessModifier()`。
[override virtual] bool QProcess::waitForBytesWritten(int msecs = 30000)
QIODevice::waitForBytesWritten (int msecs)を再実装しています。
bool QProcess::waitForFinished(int msecs = 30000)
プロセスが完了し、finished() シグナルが発信されるまで、あるいはmsecs ミリ秒が経過するまでブロックします。
プロセスが終了した場合はtrue を返し、それ以外の場合はfalse を返します(操作がタイムアウトした場合、エラーが発生した場合、またはこのQProcess がすでに終了している場合)。
この関数は、イベントループなしでも動作します。非GUIアプリケーションの作成時や、非GUIスレッドでI/O操作を実行する際に役立ちます。
警告: メイン(GUI)スレッドから この関数を呼び出すと 、ユーザーインターフェースがフリーズする可能性があります。
msecs が -1 の場合、この関数はタイムアウトしません。
finished()、waitForStarted()、waitForReadyRead()、およびwaitForBytesWritten()も参照してください 。
[override virtual] bool QProcess::waitForReadyRead(int msecs = 30000)
QIODevice::waitForReadyRead (int msecs)を再実装します。
bool QProcess::waitForStarted(int msecs = 30000)
プロセスが開始され、started() シグナルが発信されるまで、あるいはmsecs ミリ秒が経過するまでブロックします。
プロセスの起動に成功した場合はtrue を返し、それ以外の場合はfalse を返します(操作がタイムアウトした場合やエラーが発生した場合)。この関数の実行前にプロセスがすでに正常に起動していた場合は、直ちに返ります。
この関数は、イベントループなしで動作可能です。非GUIアプリケーションの作成時や、非GUIスレッドでI/O操作を実行する際に役立ちます。
警告: メイン(GUI)スレッドから この関数を呼び出すと 、ユーザーインターフェースがフリーズする可能性があります。
msecs が -1 の場合、この関数はタイムアウトしません。
関連項目: started()、waitForReadyRead()、waitForBytesWritten()、およびwaitForFinished()。
QString QProcess::workingDirectory() const
QProcess に作業ディレクトリが割り当てられている場合、この関数は、プログラムが起動する前にQProcess が移動する作業ディレクトリを返します。そうでない場合(つまり、ディレクトリが割り当てられていない場合)、空の文字列が返され、QProcess は代わりにアプリケーションの現在の作業ディレクトリを使用します。
setWorkingDirectory()も参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.