Qt进程

这篇博客主要关于在Qt中使用进程的相关内容,包含有Qt自带的class类QProcess和使用C语言fork出来的进程,两种创建进程的方式。

QProcess

这里主要包含使用QProcess的启动方式以及同步进程相关的API

启动外部程序分为两种方式:

  1. 阻塞式 execute()
QProcess *pCaller = new QProcess();
// 阻塞调用 当前窗口处理结束关闭之后 主窗口才能操作
pCaller->execute("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");
  1. 非阻塞式 start()startDetached()
QProcess *pCaller = new QProcess();
// 非阻塞调用 当前窗口的执行状态不影响主窗口的操作
pCaller->startDetached("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", QStringList());
pCaller->start("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");

非阻塞式调用分为两种:
(1)一体式: start()

void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

外部程序启动后,将随主程序的退出而退出。

(2)分离式:startDetached

void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0

外部程序启动后,当主程序退出时并不退出,而是继续运行。

这里需要注意在获取processId进程ID的时候,由于在非阻塞式分离式启动线程的方法中,有一个参数默认设置为0,因此,获取该方法产生的进程ID是均是0.

Synchronous Process API (同步进程API)

QProcess提供了一系列的函数以提到事件循环来完成同步操作:

(1)waitForStarted(): 阻塞,直到外部程序启动
(2)waitForReadyRead(): 阻塞,直到输出通道中的新数据可读
(3)waitForBytesWritten() : 阻塞,直到输入通道中的数据被写入
(4)waitForFinished(): 阻塞,直到外部程序结束果在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。

实例程序

// Qt进程调用可执行程序
void MainWindow::on_pBtn_Process_clicked()
{QProcess *pCaller = new QProcess();// 阻塞调用 当前窗口处理结束关闭之后 主窗口才能操作// pCaller->execute("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");// 非阻塞调用 当前窗口的执行状态不影 影响主窗口的操作pCaller->start("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");// startDetached// pCaller->startDetached("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", QStringList());// printf("pCaller->processId() = %d\n", getpid());llPid[iPidCnt++] = pCaller->processId();
}

fork子进程

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。点击这里有更详细关于fork()函数的解释。

实例程序

// C进程 调用可执行程序int MainWindow::set_cpu(int iCpuID)
{cpu_set_t stMask;CPU_ZERO(&stMask);CPU_SET(iCpuID, &stMask);return sched_setaffinity(0, sizeof(cpu_set_t), &stMask);
}
void MainWindow::on_pBtn_OK_clicked()
{pid_t stPid;stPid = fork();set_cpu(0);if(stPid < 0){printf("创建子进程失败!\n");return ;}if(stPid == 0){set_cpu(1);int iErr = execl("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", "/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", NULL);printf("%d\n", iErr);}
}

获取进程的ID

在QProcess中,通过Qt中的API processId()可以获取当前进程的ID(需注意,对于start()开启的进程,可以通过该API获取进程ID,但对于startDetached()开启的进程,获取的进程ID是0,关闭该进程,就会关闭系统);在fork产生的进程中可以使用getpid()获取进程ID使用getppid()获取该进程父进程的ID。

关于进程0和进程1:

  • 所有进程的祖先叫做进程0,idle进程或者swapper进程,它是在Linux的初始化阶段从无到有的创建的内核进程(该进程描述符使用的是静态分配的数据结构,其他进程都是动态分配的)
  • 进程0调用start_kernel()函数初始化内核需要的所有数据结构,激活中断,创建一个进程1的内核进程(init进程),进程0和进程1 共享每进程的所有内核数据结构。
  • 多处理器中,每个CPU都有自己的进程0。进程0创建的内核进程执行init()函数初始化内核。然后调用execve()系统调用装入可执行程序init.至此,init为一个普通的进程,且拥有每进程内核数据结构。在系统关闭之前,init一直存在,它创建和监控在操作系统外层的执行的所有进程的活动。

Qt进程-QProcess使用总结相关推荐

  1. Qt 进程 QProcess

    定义 The QProcess class is used to start external programs and to communicate with them. QProcess类是用来启 ...

  2. 【Qt】QProcess的使用总结

    引言 随着需求的更新.程序的逐渐壮大,现在需要在应用程序中调用外部编译器,执行相关指令并获得结果. 由于Qt中使用的是C++语言,自然可以调用system去执行相关指令,但是在使用过程中发生了乱码,导 ...

  3. Qt之Qprocess

    Qt之Qprocess 启动外部程序的两种方式 启动之前需要做的工作 启动状态 QProcess与QIODevice 交互 同步API QProcess进程类 进程的标准输出: QProcess 可用 ...

  4. QT 关于QProcess的一些总结

    QProcess 常被用来启动外部程序,并且可以与之进行通讯.本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上. QProcess启动外部程序,并获取其输出信息 首先新建一个外部程序 ...

  5. 关于Qt的QProcess进程间双向通信

    文章目录 前言 一.QProceess简介 二.实例 1.进程A(主进程) 2.进程B 3.运行 总结 前言 Qprocess作为Qt的进程通信类,在程序中的应用还是挺多的,不管是启动一个命令行,还是 ...

  6. Qt通过QProcess启动进程并传递命令行参数

    目录 QProcess 启动外部程序的两种方式 依赖式 分离式: 启动进程前的预处理 设置启动路径 设置启动命令参数 启动的状态 更多说明 Public Functions Signals 设计一个拉 ...

  7. Qt笔记-QProcess切换用户执行进程(Linux)

    如下命令: /bin/su cff -c "/bin/ping 127.0.0.1" 运行截图如下: 在Qt里面使用QProcess,不需要那个双引号,如下代码: #include ...

  8. Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程

    目录 基础概念 演示 基础概念 Qt中的QProcess类可以调用外部程序! 同时iostream有个函数system也可以调用外部程序!这个system也是Windows,Linux上通用的 演示 ...

  9. Qt使用QProcess进程间双向通信(linux和win系统)

    文章目录 监听效果图 前言 QProcess 猜想实现 实例验证(Linux系统实现) 问题分析 代码实现 Win系统子进程监听实现 题外话 qprocess 如何关闭子进程 监听效果图 前言 最近需 ...

  10. Qt笔记-QProcess带管道符号运行及获取进程启动时间(Linux)

    这里不能用直接写到QProcess中start中的command参数. 比如这样的shell: ps -eo pid,lstart | grep 1808 采用这样的方式: QProcess p; p ...

最新文章

  1. libjpeg-turbo介绍及测试代码
  2. 其实不的免费图标网站
  3. java comparable Comparator 区别
  4. jax-rs jax-ws_JAX-WS入门
  5. 将Visual Studio Code和Windows Subsystem for Linux一起使用
  6. 【渝粤教育】国家开放大学2018年春季 0692-21T化工设备机械基础 参考试题
  7. arcgis怎么压缩tif文件_PDF文件怎么压缩?这个方法一看就会!
  8. PyQt5教程-05-消息盒子
  9. 使用gtest做单元测试
  10. php 手机号码所属城市,基于PHP的手机号码归属地查询
  11. 开利网络拜访普恺图酒业总部,品高端酒,探共赢合作方案
  12. 【蓝桥杯选拔赛真题34】Scratch数苹果 少儿编程scratch蓝桥杯选拔赛真题讲解
  13. ArcGis将2000国家大地坐标系转WGS84
  14. Compose把Text组件玩出新高度
  15. SpringMVC-自定义类型转换器
  16. 光纤故障定位器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  17. arduino液位传感器_【教程】教你玩转Stduino之水位传感器模块
  18. Github多人team操作【转】
  19. 软件产品测试之压力测试
  20. linux破解BIOS密码

热门文章

  1. close 和 shutdown 的差别
  2. 浅谈CNN里的Lasso
  3. Linux进程虚拟内存大 性能,Linux进程分析(一) 虚拟内存和物理内存
  4. 这是我见过最秀的代码 。。。
  5. 如何快速下载720云高清全景图片
  6. 扭曲丛林服务器未响应,LOL等级最高玩家已246级 狂刷扭曲丛林攒经验
  7. win7怎么查看计算机主板,win7怎么看主板型号 win7看主板型号方法【图文】
  8. xlsm java 读取_使用POI读/写XLSM
  9. 大数据可视化核心技术
  10. 俄内政部悬赏破解 Tor 匿名网络