请教C++程序如何捕获linux shell的输出

请教C++程序如何捕获linux shell的输出,第1张

调用系统函数popen,利用管道实现输出的传送即可。

popen()

函数通过创建一个管道,调用

fork

产生一个子进程,执行一个

shell

以运行命令来开启一个进程。这个进程必须由

pclose()

函数关闭,而不是

fclose()

函数。pclose()

函数关闭标准

I/O

流,等待命令执行结束,然后返回

shell

的终止状态。如果

shell

不能被执行,则

pclose()

返回的终止状态与

shell

已执行

exit

一样。

type 参数只能是读或者写中的一种,得到的返回值(标准

I/O

流)也具有和

type

相应的只读或只写类型。如果

type

"r"

则文件指针连接到

command

的标准输出;如果

type

"w"

则文件指针连接到

command

的标准输入。

command 参数是一个指向以

NULL

结束的

shell

命令字符串的指针。这行命令将被传到

bin/sh

并使用-c

标志,shell

将执行这个命令。

popen 的返回值是个标准

I/O

流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen 的进程相同。

例程如下:

#include <cstdio>

#include <unistd.h>

#include <cstring>

#include <cstdlib>

int main()

{

    FILE *read_fp

    char buffer[BUFSIZ + 1]

    int chars_read

    memset(buffer, '\0', sizeof(buffer))

    read_fp = popen ("uname -a", "r")

    if (read_fp != NULL)

    {

        chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp)

        if (chars_read > 0)

        {

            printf("Output was: \n %s \n", buffer)

        }

        pclose(read_fp)

        exit(EXIT_SUCCESS)

    }

    exit(EXIT_FAILURE)

}

运行结果如下:

用trap命令,正常退出调用的应该是SIGHUP(1),非正常退出根据情况不同调用SIGINT(2), SIGQUIT(3),SIGTERM(15)。一般情况的退出基本上1 2 3 15都能包括了。

例:

##################################

#!/bin/sh

trap`echo get_messages` 1 2 3 15

##################################

其中用``包含的部分写你要执行的脚本或者命令。

后面的1 2 3 15是捕捉的SIGNAL的号码

★上面例子的意思是:当所执行的process接收到SIGHUP(1),SIGINT(2), SIGQUIT(3), SIGTERM(15)信号的时候,输出get_messages然后终止程序。

※如果你要执行复杂脚本或者命令的话,建议你把他写成函数

比如:

#################################

#!/bin/sh

trap `echo_many_messages` 1 2 3 15

echo_many_messages(){

echo a

echo b

echo c

}

##################################


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11997236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存