经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动。

其实对于linux系统,qt底层应该也是调用fork、exec之类的函数,对于fork,参看apue中文版第三版,有以下解析:

在f o r k之后处理文件描述符有两种常见的情况:
(1) 父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进
程终止后,它曾进行过读、写操作的任一共享描述符的文件位移量已做了相应更新。
(2) 父、子进程各自执行不同的程序段。在这种情况下,在 f o r k之后,父、子进程各自关闭
它们不需使用的文件描述符,并且不干扰对方使用的文件描述符。这种方法是网络服务进程中
经常使用的。
除了打开文件之外,很多父进程的其他性质也由子进程继承:
• 实际用户I D、实际组I D、有效用户I D、有效组I D。
• 添加组I D。
• 进程组I D。
• 对话期I D。
• 控制终端。
• 设置-用户- I D标志和设置-组- I D标志。
• 当前工作目录。
• 根目录。
• 文件方式创建屏蔽字。
• 信号屏蔽和排列。
• 对任一打开文件描述符的在执行时关闭标志。
• 环境。
• 连接的共享存储段。
• 资源限制。
父、子进程之间的区别是:
• fork的返回值。
• 进程I D。
• 不同的父进程I D。
• 子进程的t m s _ u t i m e , t m s _ s t i m e , t m s _ c u t i m e以及t m s _ u s t i m e设置为0。
• 父进程设置的锁,子进程不继承。
• 子进程的未决告警被清除。
• 子进程的未决信号集设置为空集。

由以上分析知,工作目录确实是被子进程继承的。个人理解qt的setWorkingDirectory相当于:fork后的chdir,而qt新进程的start或者startDetached相当于exec族的某一个。

再来谈回qt,在没有设置子进程的工作目录的情况下,假如新的进程代码里面使用了相对路径,那么这个相对路径相对的是父进程的工作目录,而不是传递给start还是startDetached的第一个参数里面的路径。那么问题来了,如果新的进程是要使用相对路径来读写配置文件的情况下,这个配置文件的读写将会在父进程的工作目录进行,这无疑是会有很大问题的。

针对以上问题,个人进行了以下试验并总结。

//两种办法都可以获取当前进程的路径
    QString path = QApplication::applicationFilePath();
    int index = path.lastIndexOf("/");
    path = path.mid(0, index);
    qDebug() << "applicationFilePath" << path;
    QDir dir;
    path=dir.currentPath();
    //qDebug() << "current path" << path;

//构造新进程
    QProcess *updateProcess = new QProcess(this);

//指定工作目录
    QString workingDir = "/home/mohanhui/work/tmp/test/qt5.3.2-64/softwareCenter/"
            "build-softwareCenter-Desktop_Qt_5_3_GCC_64bit-Debug" ;

//指定可执行程序的路径
    QString program = workingDir +"/softwareCenterTest";

/*1.setCurrent
     * 由子进程继承
     * 现象:由子进程继承了这个工作目录,子进程使用“./”即相当于这个setCurrent指定的目录,
     * 子进程读写文件使用"./"时,都在这个setCurrent指定的目录里面生效。
     * 但是子进程打印workingDirectory结果却是“”空的,不知道会不会有其他问题。
     */
#if 0
    //更改父进程的工作目录
    QDir::setCurrent(workingDir);
    //启动新进程
    updateProcess->startDetached(program);
    qDebug() <<"新的工作目录" << updateProcess->workingDirectory();
    return;
#endif
    
    /* 2.什么都不干
     * 现象:子进程打印workingDirectory是“”空的。子进程继承了父进程的工作目录,
     * 子进程使用“./”即相当于这个在父进程指定的目录,
     * 子进程读写文件使用"./"读写配置文件时,都在父进程的目录里面生效,所以子进程是不能正常工作的。
     */
#if 0
    //启动新进程
    updateProcess->startDetached(program);
    qDebug() <<"新的工作目录" << updateProcess->workingDirectory();
    return;
#endif
    
     /* 3.子进程启动前调用setWorkingDirectory
     * 现象:貌似用到相对路径的时候,程序会自己退出,原因不详。(可能和我的系统有关,
     * 没有在其他系统尝试)
     */
#if 0
    //设置子进程工作目录
    updateProcess->setWorkingDirectory(workingDir);
    //启动新进程
    updateProcess->startDetached(program);
    qDebug() <<"新的工作目录" << updateProcess->workingDirectory();
    return;
#endif
    
     /* 4.子进程创建时就指定工作目录,如newProcess->startDetached(program,QStringList(), workingDir);
     * 现象:很好,父进程与子进程的工作目录分开,互不影响。父进程使用相对目录
     * 时是相对父进程的工作目录,子进程使用相对路径时是相对子进程的工作目录。
     * */
#if 0
    //启动新进程
    updateProcess->startDetached(program,QStringList(), workingDir);
    qDebug() <<"新的工作目录" << updateProcess->workingDirectory();
    return;
#endif

http://blog.csdn.net/u013281495/article/details/51086943

qt新进程工作目录的设置(工作目录确实是被子进程继承的,但也可以设置)的更多相关文章

  1. 获取当前目录getcwd,设置工作目录chdir,获取目录信息

    #include <unistd.h> #include <stdio.h> #include <limits.h> int main(int argc, char ...

  2. svn稀疏目录--通过设置工作目录的深度(depth)实现目录树的部分签出

    对于一个大的版本库来说,本地工作目录签出整个目录树是即费时又占地儿的.虽然可以只签出某个子目录树,但有时候还是需要从根目录签出.那么,怎么才能只把自己感兴趣的子目录签出来呢? 从svn1.5版开始,提 ...

  3. 设置vim的默认工作路径同时与自动设当前编辑的文件所在目录为当前工作路径不冲突

    问题: 想让vim自动设当前编辑的文件所在目录为当前工作路径不冲突,但是当vim新建文件的时候,工作路径会又自动切换缓存path下. 如何使当使用vim打开文件时,vim的工作路径是当前文件所在的路径 ...

  4. Qt的信号和槽是如何工作的

    用Qt做过开发的朋友,不知道是否曾为下面这些问题疑惑过:我们知道Qt是基于C++的,Qt写的代码最终还是要由C++编译器来编译,但是我们的Qt代码中有很多C++里没有的关键字,比如slots\sign ...

  5. 把Excel工作簿的每个工作表提取出来保存为新工作簿

    平台:MS office 2010 任务:有个excel工作簿,其中有上百个工作表,要求把每一个工作表全部保存为新工作簿,如果一个一个复制出来太傻了,可以用excel自带的VB解决. 方法:打开工作簿 ...

  6. linux下的工作模型以及Nginx工作原理

      Web服务器主要任务就是处理来自客户端的请求,一般情况下Web服务器处理并发连接请求的工作模型有以下几种方式: 1.单线程web服务器(Single-threaded web servers) 此 ...

  7. Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法

    Qt 程序获取程序所在路径.用户目录路径.临时文件夹等特殊路径的方法 经常我们的程序中需要访问一些特殊的路径,比如程序所在的路径.用户目录路径.临时文件夹等.在 Qt 中实现这几个功能所用的方法虽然都 ...

  8. Wamp设置虚拟目录

    1. 默认安装 wamp后,工作目录为"..../wamp/www" 也就是PHP文件只有放在此目录下才能打得开,打开Apache的配置文件httpd.conf可以看到: 这么两行 ...

  9. 设置loadrunner中每个mdrv.exe进程中包含的vuser个数

    设置loadrunner中每个mdrv.exe进程中包含的vuser个数 在loadrunner中,默认的是每50个vuser会使用一个mdrv.exe进程,但是有些时候vuser中的使用的线程太多就 ...

随机推荐

  1. Pison geeker

    Pison on scriptogr.am Pison Abraham Lincoln: "Nearly all men can stand adversity, but if you wa ...

  2. ONOS系统架构演进,实现高可用性解决方案

    上一篇文章<ONOS高可用性和可扩展性实现初探>讲到了ONOS系统架构在高可用.可扩展方面技术概况,提到了系统在分布式集群中怎样保证数据的一致性.在数据终于一致性方面,ONOS採用了Gos ...

  3. 【C# -- OpenCV】Emgu CV 第一个实例

    原文 [C# -- OpenCV]Emgu CV 第一个实例 Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜 ...

  4. TCP/IP笔记 三.运输层(1)——UDP,TCP

    1. 运输层 1.1 两种协议:TCP和UDP. (1)TCP:提供了一种可靠的数据传输服务,TCP是面向连接的,只有链接建立起来后才能通信. (2)UDP:是把数据直接发出去,而不管对方是不是在收信 ...

  5. [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢

    一,什么是TicTacToe(井字棋)   本 游戏 为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿 ...

  6. 利用navicat for oracle将数据库全部数据移动

    话不多说.直接上图. 1.首先选择自己的数据库. 右键,data transfer 2.选择相应源数据库,目标数据库.点击start就可以.假设中间失败,可多尝试几次. 2.

  7. Join的实现步骤 以及连接的概念

    Join的实现步骤  以及连接的概念 我们常说连接有三种,即 交叉连接.内连接.外连接,这三者的概念很容易模糊,现在我们先放下概念,搞清楚完整连接实现的步骤: 一个完整的连接有三个步骤:.做笛卡儿积: ...

  8. .net版Git Server --- bonobo

    官网地址: https://bonobogitserver.com/ Demo: http://demo.bonobogitserver.com/Home/LogOn  登入admin:admin C ...

  9. [免费活动通知]RAD Studio XE8 技术研讨会(上海、成都)

     活动类型:免费研讨会 报名链接: http://forms.embarcadero.com/AP15Q3CNRADStudioDeepDiveSeminar 上海 2015 年 8 月 13 日 ...

  10. AOP编程,spring实现及JDK,CGLIB实现

    什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程)和OOP(Object-Oriented Programing,面向对象编程)思想不同,两者并非对立关系,前 ...