通常,一個控制檯(命令提示符)應用程序或命令的輸出將發送到兩個單獨的流.常規的輸出發送到標準出
(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 編程》)