调用系统函数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
}
##################################
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)