通常,一个控制台(命令提示符)应用程序或命令的输出将发送到两个单独的流.常规的输出发送到标准出
(stdout
)
并将错误消息发送到标准错误(stderr
).当你重定向控制台输出使用">"符号,只重定向标准输出.要重定向stderr
,必须指定"2> >
"的重定向符号.这将选择第二个输出流stderr
。
$ kill -HUP 1234 >killout.txt 2>killerr.txt
这个命令就会将输出和错误信息分别存放在一个单独的文件中.如果我们要将这两个输出放在一个文件中,我们可以使用>&
来组合这两种输出.如:
$ kill -1 1234 >killouterr.txt 2>&1
这个命令就可以将所有的输出放在同一个文件中.在这里我们要注意的就是命令的顺序.这个命令的顺序可以解释为重定向标准输出到文件killouterr
.然后重定向标准错误输出到与标准输出同一的地方.如果我们弄错了顺序,我们就不会得到我们希望的输出.
在这里我们会看到kill命令的结果使用了返回代码,然而常常是我们并不需要保存标准输出或是标准错误输出.我们可以使用UNIX
中的/dev/null
来忽略所有的错误输出.如:
$ kill -1 1234 >/dev/null 2>&1
gcc -Wall whestone -lm -o output/whestone.out
echo "=========== Whestone Running Report ==========="
date | tee -a ./output/whestone.report
echo "V2.2 BEGIN"
{ time ./output/whestone.out 1000000; } >> ./output/whestone.report 2>> ./output/whestone.report
echo " " >> ./output/whestone.report
今天在编译程序时碰到该问题:
whetstone.c:(.text+0x56c): undefined reference to `sin'
whetstone.c:(.text+0x585): undefined reference to `cos'
whetstone.c:(.text+0x5cf): undefined reference to `atan'
检查头文件math.h
已经包含,原来虽然程序中已经包含math.h,但在链接时要链接到数学库,加上-lm
编译选项即可,如下:
将 gcc whetstone.c -o whetstone
改为 gcc whetstone.c -lm -o whetstone
即可。
PS : 我的系统是centos,同样的问题也解决了…
使用 math.h 中声明的库函数还有一点特殊之处,gcc
命令行必须加-lm
选项,因为数学函
数位于 libm.so
库文件中(这些库文件通常位于/lib
目录下),-lm 选项告诉编译器,
我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf
)位于 libc.so
库文件中,使用 libc.so
中的库函数在编译时不需要加-lc 选项,
当然加了也不算错,因为这个选项是 gcc 的默认选项。
(以上选自《linux C 编程》)