Linux常用命令及技巧:
(1)cat /proc/version 查看當前內核的版本
(2) 掛載nfs文件夾:需要先確認在/etc/exports文件,可以用於開發板掛載的文件夾
mount -o nolock 10.0.22.30:/root/sharednfs /mnt
/etc/exports文件常見參數:
rw 可讀寫的權限
ro 只讀的權限
no_root_squash NFS 客戶端分享目錄使用者的權限,即如果客戶端使用的是 root用戶,那麼對於這個共享的目錄而言,該客戶端就具有 root的權限
sync 資料同步寫入到內存與硬盤當中
async 資料會先暫存於內存當中,而非直接寫入硬盤
(3) Vi命令行模式:set nu顯示行號
/搜索字符串
(4) 強制刪除非空的目錄:rm -rf ./hello (強制刪除本地目錄下的hello及其子目錄)
(5)在當前目錄及其子目錄中查找字符串:grep -rn "PROC_FS" ./*
./* : 表示路徑爲當前目錄.
-r 是遞歸查找
-n 是顯示行號
(6)建立文件的符號鏈接:ln -s ../hello.c ./hello1 上層目錄中的hello.c在本層目錄中建立符號鏈接hello1
(7)tar打包壓縮;tar解壓縮解包
a. 當前目錄下所有文件打包用gzip壓縮: tar -czvf hello.tar.gz ./*
b. 當前目錄下的文件解包gzip解壓縮:tar -xzvf hello.tar.gz
c. 當前目錄下所有文件打包用bzip2壓縮: tar -cjvf hello.tar.bz2 ./*
d. 當前目錄下的文件解包bzip2解壓縮:tar -xjvf hello.tar.bz2
(8)查看域名對應IP地址:nslookup www.ismartalarm.com
(9)ifconfig eth0 down 網卡down
ifconfig eth0 up 網卡up
ifconfig -a 查看當前機器中所有網絡,包括停止工作的網絡
ifconfig eth0 10.0.22.30 netmask 255.255.255.0
(10)查看nfs服務是否啓用:service nfs status
(11)查看nfs服務在各個啓動level下的啓用/禁用情況:chkconfig —list | grep ifs
修改nfs服務在啓動level下的啓用:chkconfig —level 3 nfs on
(12)查看服務的端口號: cat/etc/service
(13) VI 移動到行開頭:0(數字0)
移動到行尾:$
移動到文檔開頭:1(或輸入數字到某一行)
移動到文件尾部:G
複製行:yy 黏貼:p 刪除:dd 撤銷:u 刪除字符:x
(14)gcc與gdb查看版本:gcc -v
gdb -v
(15) linux gzip解壓包含符號鏈接文件的gzip壓縮包失敗:
Windows共享目錄, fat分區等是不支持linux的符號鏈接; 必須在ext3/4, btrfs等這些分區格式的目錄下解壓
(16)touch命令創建文件
(17) arp -a 查看接入路由器的MAC
(18)tail命令,從指定點開始將文件寫到標準輸出。使用tail命令的-f選項可以方便的查閱正在改變的日誌文件,tail -f filename會把filename裏最尾部的內容顯示在屏幕上,並且不但刷新,使你看到最新的文件內容。
(19) mkdir -p 選項允許你一次性創建多層次的目錄,而不是一次只創建單獨的目錄。如:mkdir -p /var/run
(20)printk根據不同優先級的信息可以輸出到控制檯上、/var/log/messages裏。其中,對輸出給控制臺的信息有一個特定的優先級 console_loglevel。若優先級小於這個整數值時,則消息才能顯示到控制檯上,否則,消息會顯示在/var/log/messages裏。若不加任何優先級選項,則消息默認輸出到/var/log/messages文件中。
(21)proc - process information pseudo-file system
是“進程信息虛擬文件系統”,此目錄中的文件是關於你正在運行的進程詳細信息,如PID等信息。
(22)顯示當前文件夾下所有文件的行數:cat*|wc -l
(23)顯示當前文件夾下各個文件的行數:ls *|xargs wc -l
(24)修改Uboot中的串口波特率:/Uboot/include/configs/rt2880.h
CONFIG_BAUDRATE
Uboot開機的打印位於:/Uboot/lib_mips/board.c
(25)Vim操作快捷鍵:dd--剪切光標所在行 (ndd 連續剪切多行)
yy--複製光標所在行 (nyy 連續複製多行)
p--黏貼
x--刪除光標後面的一個字符
X--刪除光標前面的一個字符
u--撤銷上一個操作 (ctrl+r 可撤銷u的修改)
.--重複上一個操作
v--進入可視模式;選中多行,y--進行復制;p--進行黏貼;d--進行刪除
G--跳轉到最後一行
nG--跳轉到第n行
:%s/old/new/g 整個文件中的old替換爲new
(26)!!可以執行上一個指令
(27)>以覆蓋的方式重定向輸出(>默認表示1>;還可以將標準錯誤輸出重定向爲2>)
>>以累加的方式重定向輸出(>>默認表示1>>;還可以將標準錯誤輸出重定向爲2>>)
<和<<表示標準輸入重定向
(28) ubuntu12.04下txt文件亂碼如何解決?
gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','GB18030','GB2312','GBK','BIG5','CURRENT','UTF-16’]"
(29)ubuntu terminal配色方案
文字顏色:#708284
背景顏色:#07242E
(30)移除所有的.O文件
find -name “*.o" | xargs rm
volatile關鍵字:
一般說來,volatile用在如下的幾個地方:
1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile;
2、多任務環境下各任務間共享的標誌應該加volatile;
3、存儲器映射的硬件寄存器通常也要加volatile說明,因爲每次對它的讀寫都可能有不同意義;
特殊字符:
~ ! @ # $ ^ & * ( ) - + = [ ] { } ? | . ‘;
TJk@GJyM:AHAw2INr:e*mfGCPN:q4H+ALMm:jMZ6pTk6:+U[kruWB
const意味着“只讀”
一個參數既可以是const還可以是volatile嗎?解釋爲什麼。
一個指針可以是volatile嗎?解釋爲什麼。
下面的函數有什麼錯誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
是的。一個例子是隻讀的狀態寄存器。它是volatile因爲它可能被意想不到地改變。它是const因爲程序不應該試圖去修改它。
是的。儘管這並不很常見。一個例子是當一箇中服務子程序修該一個指向一個buffer的指針時。
這段代碼有點變態。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
static關鍵字,意味着不要導出到程序外部
static void /* "static" means don't export the symbol... */
myfunc2()
{
myfunc3();
}
tar壓縮算法:
tar -zcvf /home/xahot.tar.gz /xahot
tar -zcvf 打包後生成的文件名全路徑要打包的目錄
例子:把/xahot文件夾打包後生成一個/home/xahot.tar.gz的文件。
幾種快速清空文件內容的方法:
$ : > filename #其中的 :是一個佔位符,不產生任何輸出.
$ > filename
$ echo “” > filename
$ echo /dev/null > filename
$ echo > filename
$ cat /dev/null > filename
mount命令詳解
Baby 鏡像更新:
1.cp /tftpboot/root_uImage /root/sharednfs
2.telnet 登錄板子
3.mount 本地鏡像所在路徑到/mnt
mount -o nolock,rw 10.0.22.18:/root/sharednfs /mnt
4.cd mnt
cp root_uImage /dev/mtdblock4
5.reboot
功能:加載指定的文件系統。
語法:mount [-afFhnrvVw] [-L<標籤>] [-o<選項>] [-t<文件系統類型>] [設備名] [加載點]
用法說明:mount可將指定設備中指定的文件系統加載到Linux目錄下(也就是裝載點)。可將經常使用的設備寫入文件/etc/fastab,以使系統在每次啓動時自動加載。mount加載設備的信息記錄在/etc/mtab文件中。使用umount命令卸載設備時,記錄將被清除。
常用參數和選項:
-a 加載文件/etc/fstab中設置的所有設備。
-f 不實際加載設備。可與-v等參數同時使用以查看mount的執行過程。
-F 需與-a參數同時使用。所有在/etc/fstab中設置的設備會被同時加載,可加快執行速度。
-h 顯示在線幫助信息。
-L<標籤>加載文件系統標籤爲<標籤>的設備。
-n 不將加載信息記錄在/etc/mtab文件中。
-o<選項>指定加載文件系統時的選項。有些選項也可在/etc/fstab中使用。這些選項包括:
async 以非同步的方式執行文件系統的輸入輸出動作。
atime 每次存取都更新inode的存取時間,默認設置,取消選項爲noatime。
auto 必須在/etc/fstab文件中指定此選項。執行-a參數時,會加載設置爲auto的設備,取消選取爲noauto。
defaults 使用默認的選項。默認選項爲rw、suid、dev、exec、anto nouser與async。
dev 可讀文件系統上的字符或塊設備,取消選項爲nodev。
exec 可執行二進制文件,取消選項爲noexec。
noatime 每次存取時不更新inode的存取時間。
noauto 無法使用-a參數來加載。
nodev 不讀文件系統上的字符或塊設備。
noexec 無法執行二進制文件。
nosuid 關閉set-user-identifier(設置用戶ID)與set-group-identifer(設置組ID)設置位。
nouser 使一位用戶無法執行加載操作,默認設置。
remount 重新加載設備。通常用於改變設備的設置狀態。
ro 以只讀模式加載。
rw 以可讀寫模式加載。
suid 啓動set-user-identifier(設置用戶ID)與set-group-identifer(設置組ID)設置位,取消選項爲nosuid。
sync 以同步方式執行文件系統的輸入輸出動作。
user 可以讓一般用戶加載設備。
-r 以只讀方式加載設備。
-t<文件系統類型>指定設備的文件系統類型。常用的選項說明有:
minix Linux最早使用的文件系統。
ext2 Linux目前的常用文件系統。
msdos MS-DOS 的 FAT。
vfat Win85/98 的 VFAT。
nfs 網絡文件系統。
iso9660 CD-ROM光盤的標準文件系統。
ntfs Windows NT的文件系統。
hpfs OS/2文件系統。Windows NT 3.51之前版本的文件系統。
auto 自動檢測文件系統。
-v 執行時顯示詳細的信息。
-V 顯示版本信息。
-w 以可讀寫模式加載設備,默認設置。
分類: Linux2012-09-11 17:37 930人閱讀 評論(0) 收藏 舉報
最近在板上mount jffs2時老是出錯,困擾了好像。主要是提示如下錯誤:
Child dir "upf" (ino #26) of dir ino #3 appears to be a hard link
Child dir "param" (ino #21) of dir ino #3 appears to be a hard link
.........................
Child dir "app" (ino #62) of dir ino #6 appears to be a hard link
一堆的這樣問題。搞的頭大。
想不出爲什麼!!
沒辦法G之。偶然找到一個blog說是flash沒有擦除。fuck。 earse 之,再tftp下載,果然正常。
該文主要內容如下:
1.判斷是不是jffs2文件。用UE打開,在前面應該是0x85,0x19 ,如果不是,則是大小端的問題。請在mkfs.jffs2命令上加入-l或者-b
2.如果出現以下錯誤,則是文件系統被覆蓋了。
3.出現以下錯誤。是因爲flash不夠幹靜。erase 之
Child dir "upf" (ino #26) of dir ino #3 appears to be a hard link
Child dir "param" (ino #21) of dir ino #3 appears to be a hard link
4.出現以下錯誤。是Flash空間不夠
jffs2_read_dnode() asked for 4096 bytes at 114688 from 3241-byte node
jffs2_read_dnode() asked for 4096 bytes at 118784 from 3241-byte node
順便帶上jffs2的命令格式:
/mkfs.jffs2 -d ./jffs2 -l -e 0x20000 -o jffs2.img
原文地地址:http://blog.csdn.net/plaris060504/article/details/6031576
【glibc 和 libc】
glibc 和 libc 都是 Linux 下的 C函數庫。
libc 是 Linux 下的 ANSI C 函數庫;glibc是 Linux下的 GUN C函數庫。
ANSI C 和 GNU C有什麼區別呢?
ANSI C 函數庫是基本的 C語言函數庫,包含了 C語言最基本的庫函數。這個庫可以根據頭文件劃分爲 15個部分,其中包括:
- <ctype.h>:包含用來測試某個特徵字符的函數的函數原型,以及用來轉換大小寫字母的函數原型;
- <errno.h>:定義用來報告錯誤條件的宏;
- <float.h>:包含系統的浮點數大小限制;
- <math.h>:包含數學庫函數的函數原型;
- <stddef.h>:包含執行某些計算 C所用的常見的函數定義;
- <stdio.h>:包含標準輸入輸出庫函數的函數原型,以及他們所用的信息;
- <stdlib.h>:包含數字轉換到文本,以及文本轉換到數字的函數原型,還有內存分配、隨機數字以及其他實用函數的函數原型;
- <string.h>:包含字符串處理函數的函數原型;
- <time.h>:包含時間和日期操作的函數原型和類型;
- <stdarg.h>:包含函數原型和宏,用於處理未知數值和類型的函數的參數列表;
- <signal.h>:包含函數原型和宏,用於處理程序執行期間可能出現的各種條件;
- <setjmp.h>:包含可以繞過一般函數調用並返回序列的函數的原型,即非局部跳轉;
- <locale.h>:包含函數原型和其他信息,使程序可以針對所運行的地區進行修改。
- 地區的表示方法可以使計算機系統處理不同的數據表達約定,如全世界的日期、時間、美元數和大數字;
- <assert.h>:包含宏和信息,用於進行診斷,幫助程序調試。
上述庫函數在其各種支持 C 語言的 IDE中都是有的。
GNU C 函數庫是一種類似於第三方插件的東西。由於 Linux是用 C語言寫的,所以 Linux的一些操作是用 C語言實現的,因此,GUN組織開發了一個 C語言的庫以便讓我們更好的利用 C語言開發基於 Linux 操作系統的程序。不過現在的不同的 Linux的發行版本對這兩個函數庫有不同的處理方法,有的可能已經集成在同一個庫裏了。
查看當前系統的 glibc 版本的方法:
(1)/lib/libc.so.6
(2)ldd - -version
錯誤觀點:glib前面有個 "g",所以認爲 glib 是 GNU的東東;同時認爲 glibc是 glib的一個子集。
其實,glib和 glibc基本上沒有太大聯繫,可能唯一的共同點就是,其都是 C編程需要調用的庫而已。
glib 是 Gtk+ 庫和 Gnome 的基礎。glib可以在多個平臺下使用,比如 Linux、Unix、Windows等。glib爲許多標準的、常用的 C 語言結構提供了相應的替代物。
libc 實際上是一個泛指。凡是符合實現了 C標準規定的內容,都是一種 libc。
glibc 是 GNU 組織對 libc 的一種實現。它是 unix/linux的根基之一。
微軟也有自己的 libc 實現,叫 msvcrt 。
嵌入式行業裏還常用 uClibc ,是一個迷你版的 libc。
ld-uClibc-0.9.28是uclibc下進行動態庫連接的連接器
uclibc
在計算術語中,uClibc是一個面向嵌入式Linux系統的小型的C標準庫。最初uClibc是爲了支持uClinux而開發,這是一個不需要內存管理單元的Linux版本,因此適合於單片機系統(uCs;此處"u"是代表"micro"的μ的羅馬化)
uClibc 是一個小型的 C庫,應用於嵌入式 Linux系統開發。它基本實現了 glibc的功能,幾乎所有 glibc支持的應用程序都能在 uClibc上運行,這使得應用程序的移植變得相當簡單,只需要使用 uClibc庫重新編譯源代碼就可以了。目前 uClibc主要運行在不帶 MMU的平臺下,支持 alpha, ARM, i386, i960, h8300, m68k, mips/mipsel, PowerPC, SH, SPARC等等。
uclibc和glibc的差別
uClibc和Glibc並不相同,兩者有許多不同之處,而且以下不同有可能給你帶來一些問題。
1. uClibc比Glibc小,雖然uClibc和Glibc在已有的接口上是兼容的,而且採用uClibc編譯應用程序比採用Glibc編譯應用程序要更方便,但是uClibc並沒有包括Glibc中的所有接口實現,因此有些應用可能在uClibc中不能編譯。
2. uClibc在可配置性上比glibc要好。
3. uClibc並不能保證發佈的庫二進制兼容舊版本uClibc庫。當一個新的版本uClibc庫被髮布,則可能需要也可能不需要重新編譯應用程序。
4. 在Glibc中調用malloc(0),將返回一個有效的指針,然而在uClibc中調用malloc(0),則返回NULL指針。根據在SuSv3中關於malloc(0)的行爲的定義,兩個庫的實現都是正確的。對於調用relloc(NULL,0),兩個庫的實現也不同。個人感覺Glibc的如此實現不是特別安全。Glibc中malloc的實現可以通過MALLOC_CHECK_環境變量調節。這個方法主要用於malloc調試。這些擴展的malloc調試特性在uClibc中是不可用的。在Linux上有許多有些的malloc調試功能的庫(如:dmalloc,electric fence,valgrind等)比Glibc中的擴展的malloc調試功能更好用。因此uClibc中去掉這些功能特性並不會有多大損失。
5. uClibc沒有提供用於數據接口的庫(libdb)。
6. uClibc不支持NSS(/lib/libnss_*),在這方面Glibc更容易支持不同方式的認證和DNS解析。uClibc僅僅支持採用flat口令文件或者shadow口令文件存儲授權信息。如果需要比這些更復雜的的授權,可以編譯安裝pam。
7. uClibc中的libresolv庫僅僅是一個樁。Glibc的libresolv庫中的部分並不是全部的功能uClibc都提供,許多函數都沒有實現。
8.提供網絡信息服務支持(NIS)libnsl庫(最初被稱爲黃頁YP),被SUN擴展爲發明爲RPC並用於網絡共享Unix口令文件。個人認爲NIS是一個令人厭惡的東西並應該使用。因此,在實現相同的功能情況下采用ldap比NIS更有效。uClibc雖然提供一個樁libnsl,但並不支持NIS。我們因此也不提供在Glibc下提供的位於/usr/include/rpcsvc裏的頭文件。
9. uClibc的區域支持並不是100%的完全。正在這方面努力
10. uClibc的數據功能函數庫內部僅僅支持long double,設置對於long double的支持也是非常有限。與此對應的只實現了較少的數學函數。如果應用程序採用double類型,則會程序會運行得較好。
11. uClibc的libcrpt庫不支持可重入crypt_r,setkey_r和encrypt_r,因爲這些也不是SuSv3所規定的。
12. uClibc直接採用內核的數據類型去定義大多數透明的數據類型。
13. uClibc支持採用linux內核結構特有的結構體"struct stat"。
14. uClibc的運行時庫librt當前缺少aio接口、全部的時鐘接口和共享內存接口(僅僅實現定時器接口和消息隊列接口)
MIPS架構的交叉編譯工具問題
某些MIPS架構的機頂盒提供了六種交叉編譯工具GCC,如下:
· mipsel-linux-gcc
· mipsel-linux-uclibc-gcc
· mipsel-uclibc-gcc
· mips-linux-gcc
· mips-linux-uclibc-gcc
· mips-uclibc-gcc
這六種有什麼區別?分別用於什麼情況呢?
1)首先,mips和mipsel的主要區別在於Big Endian(大端)和Little
Endian(小端)結構。
mips對應的是Big Endian;
mipsel對應的是Little Endian。
2)其次,要明白uclibc庫。
uclibc庫是面向嵌入式Linux系統開發優化的C語言庫。比GNU C Library更小,但接口兼容,且更易於配置。
uclibc可運行於標準的以及無MMU的Linux系統之上,支持i386、x86、x64、ARM、AVR32、Blackfin、H8300、M68K、MIPS、PowerPC、SuperH、SPARC和V850等處理器下列。
mips-uclibc-gcc表示採用uclibc庫進行編譯的GCC。
3)至於第三點“是否帶linux的區別”則不清楚,以後再補充吧
預定義__GNUC__宏
1 __GNUC__ 是gcc編譯器編譯代碼時預定義的一個宏。需要針對gcc編寫代碼時,可以使用該宏進行條件編譯。
2 __GNUC__ 的值表示gcc的版本。需要針對gcc特定版本編寫代碼時,也可以使用該宏進行條件編譯。
3 __GNUC__ 的類型是“int”,該宏被擴展後,得到的是整數字面值。可以通過僅預處理,查看宏擴展後的文本。
示例:
#include <assert.h>
#include <stdio.h>
#include <typeinfo>
#ifndef __GNUC__
#error sample for gcc compiler
#else
/* use gcc special extension: #warning , __attribute__, etc. */
#endif
int main()
{
printf("hello gcc %d\n",__GNUC__);
assert( typeid(__GNUC__)==typeid(int) );
printf("press Enter to exit\n");
(void)getchar();
}
函數名: getenv
功 能:從環境中取字符串,獲取環境變量的值
頭文件:stdlib.h
用法:char *getenv(char *envvar);
函數說明:getenv()用來取得參數envvar環境變量的內容。參數envvar爲環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格式爲envvar=value。getenv函數的返回值存儲在一個全局二維數組裏,當你再次使用getenv函數時不用擔心會覆蓋上次的調用結果。
返回值:執行成功則返回指向該內容的指針,找不到符合的環境變量名稱則返回NULL。如果變量存在但無關聯值,它將運行成功並返回一個空字符串,即該字符的第一個字節是null。
相關函數:_wgetenv、getenv_s、_wgetenv_s
分類: git2014-01-15 15:41 5847人閱讀評論(2)收藏 舉報
#取消對文件的修改。還原到最近的版本,廢棄本地做的修改。
git checkout -- <file>
#取消已經暫存的文件。即,撤銷先前"git add"的操作
git reset HEAD <file>...
#修改最後一次提交。用於修改上一次的提交信息,或漏提交文件等情況。
git commit --amend
#回退所有內容到上一個版本
git reset HEAD^
#回退a.py這個文件的版本到上一個版本
git reset HEAD^ a.py
#向前回退到第3個版本
git reset –soft HEAD~3
#將本地的狀態回退到和遠程的一樣
git reset –hard origin/master
#回退到某個版本
git reset 057d
#回退到上一次提交的狀態,按照某一次的commit完全反向的進行一次commit.(代碼回滾到上個版本,並提交git)
git revert HEAD