Linux下C++/Qt启动子进程/Process,执行命令行或查询的方法,含QProcess用法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文总结了四种linux下的启动子进程执行命令行的方法

基于c++/c,包含qt下的qprocess的使用

linux方法,windows大同小异,请自行验证

----------------------------------------------------------------------------------------------------------------------------

1、system,执行命令行

system()是C标准库中提供的一个函数,它可以在Linux/Unix系统中执行另一个命令或者程序。system()函数将要执行的命令作为参数传入,并且会创建一个子进程来运行这个命令,然后等待这个子进程结束并返回。

system()函数如下:

int system(const char* command);

其中command参数是要执行的命令或者程序。当command不为NULL时,system()函数会调用shell来解释执行该命令或者程序,否则不执行任何操作。

在qt中使用方法示例如下:

    QString strCMD="df -h";
    system(strCMD.toLatin1().data());

system()函数的返回值有以下3种情况:

    如果调用失败,则返回与目标平台相关的非零错误代码;
    如果command为NULL,则返回0;
    如果调用成功,则返回被调用进程的退出状态。

system()函数适用于一些简单的命令行交互场景,例如启动另一个程序、改变环境变量等。由于system()函数是同步阻塞式的,执行时间较长的命令可能会导致UI界面卡死,因此在GUI程序中应该避免频繁使用system()函数。

2、使用fork()函数创建子进程,再在子进程中使用exec()函数来执行另一程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    pid_t pid = fork();
    if (pid < 0) { // 子进程创建失败
        perror("fork");
        exit(1);
    } else if (pid == 0) { // 子进程
        execlp("/bin/ls", "ls", "-l", NULL); //参数:路径,命令,参数
        perror("execlp"); // 如果执行失败,则输出错误信息
        exit(1);
    } else { // 父进程
        wait(nullptr); // 等待子进程结束
        printf("process child finished");
        exit(0);
    }
}

3、shell命令行,执行命令行并获得执行结果--推荐

在shell终端中执行相应的命令行指令,使用类似于system()的函数来执行命令,并将其输出捕获到当前程序中.

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main() {
    string command = "ls -la";
    FILE* fp = popen(command.c_str(), "r");
    if (!fp) {
        cerr << "Failed";
        return -1;
    }
    char buffer[1024] = {0};
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        cout << buffer;
    }
    pclose(fp);
    return 0;
}

4、posix_spawn()vfork()等系统库函数、安全性和可靠性高

使用Linux系统库提供的函数来创建并执行进程

#include <iostream>
#include <vector>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;

int main() {
    pid_t pid = vfork(); // 创建子进程
    if (pid == -1) { // 如果失败,则退出
        perror("fork");
        exit(1);
    } else if (pid == 0) { // 子进程
        vector<char*> args{const_cast<char*>("ls"), const_cast<char*>("-la"), nullptr};
        // execvp()函数把args传入新的进程中并执行命令
        execvp(args[0], &args[0]);
        _exit(127); // 如果执行失败,则退出,并输出错误信息
    } else { // 父进程
        int status;
        waitpid(pid, &status, 0); // 等待子进程结束
        if (!WIFEXITED(status)) { // 子进程未正常退出
            cerr << "Child process terminated abnormally." << endl;
        } else if (WEXITSTATUS(status) != 0) { // 子进程返回了非0状态码
            cerr << "Child process returned error code: " << WEXITSTATUS(status) << endl;
        } else {
            cout << "Child process finished." << endl;
        }
    }
    return 0;
}

5、QProcess用法

    5.1 使用start()函数来启动进程:这是一种最简单的启动进程方式。调用start()函数并传入要执行的程序名称和参数即可启动一个新的进程。

        QProcess process;
        process.start("ls", QStringList() << "-l");

    5.2 使用startDetached()函数来启动进程:与start()函数类似,但不需要等待进程完成并返回。可以将该函数作为静态方法调用,因此无需实例化QProcess对象即可启动新进程。

        QProcess::startDetached("ping", QStringList() << "-c" << "5" << "www.baidu.com");

    5.3 在构造函数中设置命令行参数:在创建QProcess对象时,可将要执行的命令及其参数一起传入构造函数中,这样可以省略掉start()函数的调用。

        QProcess process(nullptr);
        QStringList args = {"-l"};
        process.start("ls", args);

    5.4 重定向进程的标准输入和输出:通过设置QProcess对象的标准输入、标准输出和标准错误设备,可以实现对进程I/O流的重定向,使得后续能够获取进程的输出结果或者将某些数据发送给进程。

        QProcess process;
        process.setStandardOutputFile("output.txt"); // 指定标准输出的设备为文件
        process.start("ls", QStringList() << "-lR" << "/"); // 启动进程并重定向标准输出
        if (process.waitForFinished()) {
                    QByteArray output = process.readAllStandardOutput();
        qDebug() << output;  // 输出读取到的数据

}

linux环境下QT使用QProcess 关闭程序 stopProcess()方法会先发送SIGTERM信号终止进程,然后等待进程完全终止。如果不调用waitForFinished(),那么可能会导致进程没有完全终止就被关闭。在Ubuntu中可以使用kill命令来终止进程。为了在Qt代码中使用kill命令,可以通过继承QProcess类来实现。这里使用了自定义的MyProcess类继承QProcess,并添加了stopProcess()方法来实现终止进程的功能。调用第三方程序,调用完后需要终止。//调用需要终止的程序。// 发送SIGTERM信号。 阅读详情

相关推荐

Qt中使用CreateProcess打开命令执行命令

Qt应用程序中,执行命令命令并获取输出结果可以使用QProcess类。现在,我们可以在Qt应用程序中调用这个函数来执行命令命令并获取输出结果。现在,我们可以在Qt应用程序中调用这个函数来执行命令命令并获取输出结果。在上面的示例中,我们将命令设置为"dir",这将列出当前目录的内容。在上面的示例中,我们将命令设置为"dir",这将列出当前目录的内容。这样,当我们点击按钮时,程序将执行命令并将输出结果显示在文本编辑器中。这样,当我们点击按钮时,程序将执行命令并将输出结果显示在文本编辑器中。

cl6789的博客 707

QtQProcess(一)运cmd命令

Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。一、启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后。将随主程序的退出而退出。

GuoGuoABC 1万+

【并发编程二十三】linux系统,c++启动进程、杀进程查询进程id

简介:在Linux系统中,使用C++编写程序可以通过多种方式控制进程,如启动程序、杀死进程查询进程ID。本教程将详细介绍在Linux系统中使用C++的system函数、popen函数、fork函数以及相关命令的区别和用法

junxuezheng的博客 1590

Qt的命令解析

Qt命令解析器会按照预先定义的选项去解析命令参数

读书笔记 4633

【Hi3519DV500】开机自启动

主要分别介绍通过SysVinit(传统 init 系统)和 systemd(新型init系统)的开机自动动机制和用例

weixin_46573401的博客 457

使用Qt程序打开终端输入命令

使用Qt程序打开终端,启动ros节点,启动launch文件等等

m0_56451176的博客 6601

Linux下的QTQProcessshell脚本文件(**)

Linux下的QTQProcessshell脚本文件

ken2232的博客 4132

windows qt使用cmd执行命令

以下是采用 Qprocess实现 ,当然可以使用syetem实现。

D1789621448的博客 2391

QT调用命令(cmd) 简洁版

QT调用命令(cmd)

qq_72583325的博客 1306

QT实现父进程下运一个子进程(treeView,Qprocess

程序功能描述:程序运时获取系统文件目录,找到指定运程序后,双击鼠标运该程序,将运程序的打印信息显示出来。 代码如下, Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui-&gt;setupUi(this); model = new QFileSystemM...

u010847928的博客 3868

QProcesslinux命令的命令(详解各种情况可能存在的问题)

因为我是做的linux下开发,所以程序中需要多次在qt中调用linux命令的命令,并且需要根据命令的执结果做出相应的判断。qt中使用QProcess类实现进程间通信,也就是说QProcess可以调用外部程序并获取外部程序的信息。linux中通过启动bash(windows中启动cmd)来执行命令的命令,并可以获取命令的返回信息。下面我详细介绍一下QProcess的具体用法和我踩过的坑以及注意事项:start();//启动一个进程close();//关闭启动的外部进程write();

szembed的博客 2074

QT调用命令方法/ubuntu下运一个文件调用命令一堆指令

1.QT添加头文件 #include<QProcess> #include<QFile> #include<QString> #include<QTextStream> 2.新建一个函数,如下: void test::termTest() { system("gnome-terminal -- bash -c 'touch 2.sh'&");//QT调用命令,创建一个名为2.sh的脚本文件,注意,当前目录是build-${PROJECT_N

SunPengMSE的博客 3301

Qt-QProcess-启动子进程-控制台进程隐藏-获取子进程标准输出和返回码

当有新的标准输出数据可⽤时,它也会发出readyReadStandardOutput()信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。⽆需调⽤read()函数,readLine()函数getChar()函数,⽽是可以通过调⽤readAllStandardOutput()函数readAllStandardError()函数显式地从两个通道之⼀读取所有数据。这样生成的程序,窗口需要程序编码创建,不创建则没有窗口,从而达到无显示的隐藏效果。

插件开发 4449

C++启动一个进程

1.调用 CreateProcess STARTUPINFO si; PROCESS_INFORMATION pi; si.dwFlags =   STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &p

喻大帅的软件工作室 6211

C++启动其它进程的方式

C++启动其它进程的方式。

qq_34552942的博客 1603

linux qt getpid,Qt:Windows编程—Qt实现进程管理

前言继续学window编程,学呀学呀 学无止境,学到Windows进程相关API了。利用相关的API使用Qt写界面实现了一个简单的进程管理。主要用到 进程的创建、进程的枚举、线程的枚举、DLL的枚举、进程提权等功能。相关API的介绍可以看 C/C++:Windows编程—创建进程、终止进程、枚举进程、枚举线程、枚举DLL界面先看看qt写的界面吧。代码创建进程// 创建进程void Widget::...

weixin_39975744的博客 472

第十三课:QtCmd 命令终端应用程序开发

文章详细讲解了如何开发一个类似于 Windows 命令提示符 Linux 命令终端的应用程序,并附上完整代码

Mr-Gui的博客 4038

VC++中如何启动外部进程和关闭某个进程

参考资料 c++ 启动exe(外部程序) 三个SDK函数: WinExec, ShellExecute,CreateProcess C++ 枚举进程信息,并结束指定进程 C/C++ Windows API——枚举进程、结束进程及提升权限 CreateProcess-Creating Processes The CreateProcess function creates a new process, which runs independently of the creating process. Howe

ccf19881030的专栏 3507

QT调用linux外部命令者shell script

由以上两种操作可以看出,使用标准库的 system() 方法外部 Shell 脚本非常的简单,但我并没有研究如何在使用 system() 方法的情况下将 Shell 脚本的输出打印到我们的应用程序上。而且该方法还有个显而易见的缺点即当我们的 Shell 脚本是需要持续运时,使用 system() 方法第一种操作(不开新的终端打印输出)去执它会造成我们的主进程堵塞;首先我们需要理解的是,Shell脚本是不需要编译的,而是直接运解释器,将脚本作为解释器程序参数运的。" 的 Shell 脚本。

蚂蚁取经 3798
上一篇: Linux下qt/C++全局键盘监控,处理键盘事件,输出按键码
下一篇: QtQuick/QML方法1:信号监听、单例类注册与调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值