• Qt之QProcess 和 c语言对比


    命令行参数

    大多控制台程序都接受命令行参数,一个例子:

    #include <stdio.h>
    int main(int argc, char **argv)
    {
        for (int i=1; i<argc; ++i)
            printf("%s\n", argv[i]);
        return 0;
    }

    编译,调用程序时可指定命令行,结果:

    $ ./process a b "c d"
    a
    b
    c d

    用QProcess调用外部程序时,可直接指定命令行参数

    QProcess process;
    //
    process.execute();//这个函数的 功能 是 调用 外部程序时 会阻塞,知道 外部程序结束

    process.start("./process", QStringList()<<"a"<<"b");process.start("./process a b");

    后一种写法看起来写起来比较简洁,但是程序路径或参数中包括空格时,就不如第一种方便了。


    标准输出

    对于控制台程序来说,这个可能是用的最多的了。比如上一个程序,我们遍历命令行参数,然后输到标准输出。

    在控制台下,我们通常会使用重定向功能,比如:

    $./process a b "c d" > out.txt 

    在QProcess下,我们使用

    QProcess::readAllStandardOutput ()

    获取标准输出

    QProcess::setStandardOutputFile()

    设置输出到的文件,相当于前面的重定向

    QProcess process;
    process.start("./process", QStringList()<<"a"<<"b");
    process.readAllStandardOutput();

    可以使用:

    • QProcess::setStandardOutputProcess()

    将标准输出作为另个进程的标准输入。形成 ls -l | more 这样的管道操作

    由于QProcess是QIODevice的派生类,故:

    • read()
    • readLine()
    • ...

    都可以直接用获取被调用程序的标准输出。


    标准出错

    相对于标准输出,这个东西大家似乎用的比较少了。

    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        fprintf(stdout, "Hello STDOUT!\n");
        fprintf(stderr, "Hello STDERR!\n");
        return 0;
    }

    编译运行(注意区分两个流,标准出错的文件描述符是2):

    $ ./process
    Hello STDOUT!
    Hello STDERR!
    $ ./process > out.txt
    Hello STDERR!
    $ ./process > out.txt 2>err.txt
    $


    标准输入

    这个也不用多说,使用scanf()/gfets()等函数:

    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        char contents[1024];
        fgets(contents, 1024, stdin);
        printf("output: %s", contents);
        return 0;
    }

    运行:

    $ ./process 
    1+1=2
    output: 1+1=2

    如果要输入的内容在文件内,也可以使用重定向

    $ ./process < intput.txt
    output: contents of input.txt

    在QProcess中,直接使用QIODevice的write()函数

    QProcess process;
    process.start("./process")
    process.write("intput");

    也可以设置文件作为输入

    • QProcess::setStandardInputFile()

    返回值

    似乎很多人分不清返回值和标准输出的概念。

    int main()
    {
    return 0;
    }

    也就是程序中 return X/exit(X) 等函数中指定的值了。

    在Windows下,通过

    C:\> process.exe
    C:\> echo %errorlevel%

    在Linux下,通过

    $ ./process
    $ echo $?

    获得返回值。

    在QProcess下,则通过:

    • int QProcess::execute()
    • int QProcess::exitCode()

    获得返回值。











  • 相关阅读:
    Hibernate5.2之一对一主键关联(四)
    Hibernate5.2关联关系之双向一对多(三)
    Hibernate5.2关联关系之单向多对一(二)
    Hibernate5.2关联关系之单向一对多(一)
    Hibernate5.2之原生SQL查询
    Hibernate5.2之HQL查询
    Winform 按键组合键
    当Bitmap的宽度大于ImageView的最大显示宽度时对ImageView的宽高重新计算来适应Bitmap的宽高(转)
    sqlserver 函數執行動態sql語句,取值
    时间格式化 字符串转时间(转)
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744782.html
Copyright © 2020-2023  润新知