当前位置: 技术问答>linux和unix
使用system调用进行重定向的严重问题
来源: 互联网 发布时间:2016-11-21
本文导语: 本帖最后由 kaixinguo386 于 2010-12-30 14:52:17 编辑 详细描述我的情况: 我的程序在启动时关闭了标准输出和标准错误 1、我在程序中使用system("traceroute 192.168.15.98 >> /home/traceroute");后在traceroute文件中没有看到任何内容; ...
我的程序在启动时关闭了标准输出和标准错误
1、我在程序中使用system("traceroute 192.168.15.98 >> /home/traceroute");后在traceroute文件中没有看到任何内容;
2、若我不关闭标准输出和标准错误则没有问题,打印可见
3、在终端中输入此命令没有任何问题;
4、在此程序中系统调用route和ping时也没有问题
疑问:
1、我打印的内容到哪里去了呢?
2、是我的system使用存在问题,还是traceroute本身有问题,还是由于子进程的标准输出也被关闭的缘故???
请高手赐教!
|
可能还是打印缓冲引起的吧。在程序执行的时候有做两件事来确定是什么原因:
1, lsof -p 看是否存在标准输出及标准错误描术符.
2, 等traceroute退出后再看/home/traceroute是否存在内容
1, lsof -p 看是否存在标准输出及标准错误描术符.
2, 等traceroute退出后再看/home/traceroute是否存在内容
|
system("traceroute 192.168.15.98 &> /home/traceroute");
这样试一下,可能traceroute的日志是用标准错误输出的
这样试一下,可能traceroute的日志是用标准错误输出的
|
我的试验结果
// sys.c
#include
main() { system("traceroute 10.164.129.29 > trace.out"); }
编译后:
1、执行a.out,可以输出
2、执行a.out 1>&-,依然可以输出
也就是说无论关闭标准输出与否,system.. 那个语句都可以输出
// sys.c
#include
main() { system("traceroute 10.164.129.29 > trace.out"); }
编译后:
1、执行a.out,可以输出
2、执行a.out 1>&-,依然可以输出
也就是说无论关闭标准输出与否,system.. 那个语句都可以输出
|
char tracerouteip[100] = {0};//有的编译器只初始话第一个字节,好象应该用{0,}
...
memcpy(tracerouteip,testipaddr,100*sizeof(char));//你确定testipaddr有100那么长吗?
//sprintf(command,"traceroute %s > /home/sw/traceroute",tracerouteip);
sprintf(command,"traceroute 192.168.15.98 > /home/sw/traceroute");//这样先试试,另外有/home/sw这个路径吗?
system(command);
...
memcpy(tracerouteip,testipaddr,100*sizeof(char));//你确定testipaddr有100那么长吗?
//sprintf(command,"traceroute %s > /home/sw/traceroute",tracerouteip);
sprintf(command,"traceroute 192.168.15.98 > /home/sw/traceroute");//这样先试试,另外有/home/sw这个路径吗?
system(command);
|
建议lz用10楼的代码先试试.
|
不太可能哟,关闭了标准输出之后是不会再看到的,除非又打开了。
10楼上边的代码我在UBUNTU上实验过了,不会出现显示的,反正我在我的电脑上测的时候没有出现,
而且楼主给的代码并不完全,并不能详细分析
10楼上边的代码我在UBUNTU上实验过了,不会出现显示的,反正我在我的电脑上测的时候没有出现,
而且楼主给的代码并不完全,并不能详细分析
|
而且十楼的代码并没有关闭标准输出和标准错误,所以,system命令一定会在命令行上显示的,这并不奇怪啊
|
不重定向,在屏幕上有显示么