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() |
受保护函数
| void | setProcessState(QProcess::ProcessState state) |
重新实现的受保护函数
| virtual qint64 | readData(char *data, qint64 maxlen) override |
详细说明
运行进程
要启动一个进程,请将要运行的程序的名称和命令行参数作为参数传递给start()。参数应作为QStringList 中的独立字符串提供。
或者,您可以使用setProgram()和setArguments()设置要运行的程序,然后调用start()或open()。
例如,以下代码片段通过将包含“-style”和“fusion”的字符串作为参数列表中的两个项传递,在 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() 来获取当前进程状态。
注意: VxWorks、iOS、tvOS 或 watchOS 不支持QProcess 。
查找可执行文件
要运行的程序可以通过调用setProgram()或在start()调用中直接设置。使用程序名和参数调用start()的效果,等同于在该函数之前先调用setProgram()和setArguments(),然后在不带这些参数的情况下调用该重载方法。
QProcess 会以三种不同的方式解析程序名称,这与 Unix 壳层和 Windows 命令解释器在其各自命令行中的运作方式类似:
- 如果程序名是一个绝对路径,则将直接启动该可执行文件,QProcess 不会进行任何搜索。
- 如果程序名是一个包含多个路径组件的相对路径(即包含至少一个斜杠),则搜索该相对路径的起始目录取决于操作系统:在 Windows 上,它是父进程的当前工作目录;而在 Unix 上,则是通过setWorkingDirectory() 设置的目录。
- 如果程序名是一个不含斜杠的普通文件名,其行为取决于操作系统。在 Unix 系统上,QProcess 将搜索
PATH环境变量;在 Windows 上,搜索由操作系统执行,并将首先搜索父进程的当前目录,然后才是PATH环境变量(完整列表请参阅CreateProcess的文档)。
为避免平台依赖的行为或因当前应用程序的启动方式而引发的任何问题,建议始终向要启动的可执行文件传递绝对路径。 对于随应用程序一起提供的辅助二进制文件,可以使用以QCoreApplication::applicationDirPath() 开头的路径。同样地,若要显式运行相对于setWorkingDirectory() 设置的目录而言的执行文件,请根据具体情况使用以 "./" 或 "../" 开头的程序路径。
在 Windows 系统上,除CreateProcess文档中所述的情况外,大多数情况下无需添加 ".exe" 后缀。此外,QProcess 会将程序名称中的 Unix 风格正斜杠转换为 Windows 路径中的反斜杠。这使得使用 QProcess 的代码能够以跨平台的方式编写,如上文示例所示。
QProcess 不支持直接执行 Unix shell 或 Windows 命令解释器的内置函数,例如cmd.exe 中的dir 命令,或是 Bourne shell 中的export 命令。在 Unix 系统上,尽管许多 shell 内置命令也以独立可执行文件的形式提供,但它们的行为可能与作为内置命令实现的版本不同。 要运行这些命令,应通过适当的选项显式调用解释器。 对于 Unix 系统,请使用两个参数启动“/bin/sh”:一个是“-c”,另一个是要运行的命令行字符串。对于 Windows 系统,由于cmd.exe 解析命令行的方式不符合标准,请使用setNativeArguments()(例如,“/c dir d:”)。
环境变量
QProcess API 提供了用于操作子进程可见环境变量的方法。默认情况下,子进程将拥有调用start() 函数时当前进程环境变量的副本。这意味着在该调用之前使用qputenv() 进行的任何修改都将反映在子进程的环境中。 请注意,QProcess 不会尝试防止其他线程中调用的qputenv() 引发竞态条件,因此建议在应用程序初始启动后避免使用qputenv()。
可以通过processEnvironment() 和setProcessEnvironment() 函数(这两者都使用QProcessEnvironment 类)来修改特定子进程的环境。默认情况下,processEnvironment() 将返回一个QProcessEnvironment::inheritsFromParent() 返回值为 true 的对象。如果设置的环境不继承自父进程的环境,则 QProcess 会在子进程启动时直接使用该环境。
通常的操作流程是:通过调用QProcessEnvironment::systemEnvironment()从当前环境开始,然后对特定变量进行添加、修改或删除。最终生成的变量列表可通过setProcessEnvironment()应用到QProcess上。
可以通过使用 QProcessEnvironment() 的默认构造函数,从环境中移除所有变量,或者从空环境开始。除非在受控且特定于系统的条件下,否则不建议这样做,因为当前进程环境中可能存在已设置的系统变量,而这些变量对于子进程的正常执行是必需的。
在 Windows 系统上,如果当前进程的 `"PATH" ` 和 `"SystemRoot" ` 环境变量未被设置,QProcess 会将其复制过来。虽然无法完全清除这些变量,但可以将其设置为空值。在 Windows 系统上将 `"PATH" ` 设置为空值,很可能导致子进程无法启动。
通过通道进行通信
进程有两个预定义的输出通道:标准输出通道(stdout )提供常规控制台输出,标准错误通道(stderr )通常提供进程打印的错误信息。这两个通道代表两条独立的数据流。 您可以通过调用setReadChannel()在它们之间切换。当当前读取通道上有数据时,QProcess会发出readyRead()信号;当有新的标准输出数据时,会发出readyReadStandardOutput()信号;当有新的标准错误数据时,则会发出readyReadStandardError()信号。 与其调用read()、readLine() 或getChar(),不如通过调用readAllStandardOutput() 或readAllStandardError() 来显式读取这两个通道中的所有数据。
这些通道的术语可能会造成误解。请注意,进程的输出通道对应于 QProcess的读取通道,而进程的输入通道则对应于 QProcess的写入通道。这是因为我们使用 QProcess 读取的是进程的输出,而我们写入的内容则成为进程的输入。
QProcess 可以合并这两个输出通道,使得运行中进程的标准输出和标准错误数据都使用标准输出通道。在启动进程之前,调用 `setProcessChannelMode()` 并传入 `MergedChannels ` 即可启用此功能。 您还可以通过将ForwardedChannels 作为参数传递,将运行中进程的输出转发至调用该进程的主进程。此外,也可以仅转发其中一个输出通道——通常会使用ForwardedErrorChannel ,但ForwardedOutputChannel 同样可用。请注意,在GUI应用程序中使用通道转发通常是个坏主意——您应该通过图形界面呈现错误信息。
某些进程需要特殊的环境设置才能运行。您可以通过调用setProcessEnvironment() 来为进程设置环境变量。要设置工作目录,请调用setWorkingDirectory()。默认情况下,进程在调用进程的当前工作目录中运行。
通过 QProcess 启动的 GUI 应用程序所属窗口的位置及其屏幕 Z 序,由底层窗口系统控制。对于 Qt 5 应用程序,可使用-qwindowgeometry 命令行选项指定位置;X11 应用程序通常支持-geometry 命令行选项。
同步进程 API
QProcess 提供了一组函数,允许在不使用事件循环的情况下使用它,通过将调用线程挂起直至发出特定信号:
- waitForStarted() 会阻塞直到进程启动。
- waitForReadyRead() 会阻塞,直到当前读取通道上有新数据可供读取。
- waitForBytesWritten() 会阻塞,直到向进程写入一个数据负载为止。
- 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 条目原样传递给子进程,不涉及 shell 处理,因此诸如& 、| 、; 或$ 等字符不具有特殊含义。 在 Windows 系统上,QProcess 将根据 Win32 函数CommandLineToArgvW() 规定的规则,对参数进行适当的引号处理和转义。无论在哪个操作系统上,QProcess 都不会自动使用 shell。
使用splitCommand() 和startCommand() 时,请注意它们的令牌化及转义规则与 Windows 和 POSIX 壳层不同。转义不正确的输入可能导致参数注入。
启动 Shell 和批处理文件
在 Windows 上,请勿将不可信的参数传递给批处理文件(.bat 或.cmd )或cmd.exe 。建议改用setNativeArguments(),并自行对参数进行引号包裹和转义处理。QProcess 会根据CommandLineToArgvW() 规则对参数进行引号包裹,但cmd.exe 解析命令行的方式不同,会接收未转义的 shell 元字符% 、^ 、& 、| 、< 、> 、( 和) 。 因此,将类似args&calc.exe 的参数传递给.cmd 脚本时,会将calc.exe 作为第二个命令执行。请注意,在 Windows 系统中,所有参数都会在内部合并为一个命令行字符串,因此即使像process.start("file.cmd", {"args", "&calc.exe"}) 这样分别传递参数也无法解决问题。许多工具会安装批处理脚本(例如npm 、yarn 或gradle 的包装脚本),因此很容易忽略目标文件是批处理文件这一情况。
在 Unix 系统上,如果显式启动 shell(例如process.start("/bin/sh", {"-c", "args&&malicious_binary"}) ),可能会出现类似问题——此时由 shell(而非 QProcess)解析-c 字符串,并像 Windows 系统中cmd.exe 的处理方式一样,将&& 、; 、| 、反引号和$() 赋予其常规含义。在此情况下,末尾的&&malicious_binary 会在args 之后运行第二个程序,因此从不可信输入中拼接出-c 字符串即构成命令注入。
另请参阅 QBuffer 、QFile 以及QTcpSocket 。
成员类型文档
QProcess::CreateProcessArgumentModifier
注意:此 typedef 仅在桌面版 Windows 上可用。
在 Windows 系统上,QProcess 使用 Win32 API 函数CreateProcess 来启动子进程。虽然QProcess 提供了一种无需关注平台细节的便捷方式来启动进程,但在某些情况下,我们可能需要对传递给CreateProcess 的参数进行微调。这可以通过定义一个CreateProcessArgumentModifier 函数并将其传递给setCreateProcessArgumentsModifier 来实现。
CreateProcessArgumentModifier 函数接受一个参数:指向CreateProcessArguments 结构体的指针。在调用CreateProcessArgumentModifier 函数后,该结构体的成员将被传递给CreateProcess 。
以下示例演示了如何向CreateProcess 传递自定义标志。当从控制台进程 A 启动子进程 B 时,QProcess 默认会为子进程 B 复用进程 A 的控制台窗口。而在本示例中,则为子进程 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 | 请求进程与其控制终端断开连接(如果存在控制终端)。如果不存在控制终端,则不执行任何操作。如果终端关闭,或者收到其他终端控制信号(如SIGTSTP 、SIGTTIN 、SIGTTOU ),仍与控制终端连接的进程可能会收到“挂断”(SIGHUP )信号。 请注意,在某些操作系统上,进程只有在作为会话领导者时才能与控制终端断开连接,这意味着可能需要设置CreateNewSession 标志。与此类似,这也是将进程转为守护进程的步骤之一。 |
QProcess::UnixProcessFlag::IgnoreSigPipe | 0x0002 | 始终将SIGPIPE 信号设置为忽略(SIG_IGN ),即使已设置ResetSignalHandlers 标志也是如此。默认情况下,如果子进程在通过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 信号处理程序重置为默认状态(即向signal(2) 传递SIG_DFL )。此标志有助于确保任何被忽略(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 值的按“或”运算组合。
另请参阅 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 printing调用start() 时会隐式打开写通道。
另请参阅 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 = {})
在新的进程中启动程序 `program `,并传入参数 `arguments `,等待其执行完毕,然后返回该进程的退出代码。新进程写入控制台的任何数据都会转发给调用进程。
环境和工作目录均继承自调用进程。
参数处理方式与相应的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 将在父进程中发出 `errorOccurred()` 并传入代码 `QProcess::FailedToStart `。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() 可能显示为“子进程修饰符报告错误:辅助通信通道:文件描述符无效”。
该函数不会返回给调用方。若不在子进程修饰符中使用,或未使用正确的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 模式)。
使用由 `setArguments()` 设置的参数,启动由 `setProgram()` 指定的程序。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)
为子进程设置modifier 函数,适用于Unix系统(包括macOS;关于Windows,请参阅setCreateProcessArgumentsModifier())。当fork() 或vfork() 完成,且QProcess 已为子进程设置好标准文件描述符后,但在execve() 之前,该函数将在子进程的start()内部被调用,其中modifier 参数指定的函数将被调用。
以下是一个将子进程配置为无特权运行的示例:
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 。
在某些操作系统中,系统 API 用于将命令行arguments 原生传递给子进程时,默认使用单个字符串;因此,可能会存在无法通过 `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 进程的标准输入。
以下 shell 命令:
command1 | command2可以通过QProcess 并使用以下代码来实现:
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 拆分为一个令牌列表,并返回该列表。
包含空格的词元可以用双引号括起来;三个连续的双引号表示引号字符本身。
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:参数会被加引号,并组合成与CommandLineToArgvW() Windows 函数兼容的命令行。对于具有不同命令行引号要求的程序,您需要使用setNativeArguments()。一个不遵循CommandLineToArgvW() 规则的典型程序是 cmd.exe,因此所有批处理脚本也不遵循该规则。
如果QProcess 对象已经正在运行一个进程,控制台可能会显示一条警告,而现有进程将继续运行,不受影响。
注意: 子进程启动成功 仅意味着操作系统已成功创建该进程并分配了每个进程都拥有的资源(如进程 ID)。子进程可能在运行初期就崩溃或以其他方式失败,从而无法产生预期的输出。在大多数操作系统上,这可能包括动态链接错误。
另请参阅 processId()、started()、waitForStarted() 以及setNativeArguments()。
void QProcess::start(QIODeviceBase::OpenMode mode = ReadWrite)
使用由 `setArguments()` 设置的参数,启动由 `setProgram()` 设置的程序。OpenMode 被设置为 `mode`。
这是一个重载函数。
另请参阅 open()、setProgram() 和setArguments()。
[since 6.0] void QProcess::startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
在新的进程中启动命令 `command `。OpenMode 设置为 `mode`。
command 是一个包含程序名及其参数的单一文本字符串。参数之间用一个或多个空格分隔。例如:
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)
在新的进程中启动程序program ,并传入参数arguments ,随后与该进程脱离。成功时返回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
返回一个UnixProcessParameters 对象,该对象描述了在Unix系统上将应用于子进程的额外标志和设置。默认设置对应于通过默认构造方式创建的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.