http://antkillerfarm.github.io/
GUI設計工具
GTK+的程序可以使用Glade來設計界面,它會生成一個腳本,運行該腳本,並make就行了。
QT的稍微麻煩一些。
1)首先打開QT Designer(新建時,不能使用KDE Designer,但修改建好後的工程可以,不知道是BUG,還是怎麼回事)新建一個窗體,然後新建一個main.cpp,並將剛才生成的窗體選為主窗體。
2)打開KDev C/C++,選擇導入工程,選擇QMake Based導入,然後即可在IDE中編譯並運行。
上面寫的兩個都是官方的設計器,而WxWidgets沒有官方的設計器,但有很多第三方的設計器,我使用的是免費且開源的wxFormBuilder。用它可生成XRC文件,而WxWidgets中有使用XRC文件的接口。
編程所用命令簡介
cc:C/C++編譯器
as:GNU匯編編譯器
ld:鏈接器
as86、ld86:8086匯編編譯器和鏈接器
linux文件分割用split,合並用cat。最近下了一本采用split分割的書,但是我沒有Linux環境,於是在windows的命令行下用type、>、>>合並了文件。
printf和wprintf混用的問題
在linux中不可混用printf和wprintf,如果混用的話,則
後使用的函數沒有輸出。
例如
printf("a\n");
wprintf(L"b\n");
輸出為:
a
而
wprintf(L"b\n");
printf("a\n");
輸出為:
b
關於這個問題的討論見
http://bytes.com/groups/c/852681-wprintf-conflicts-printf-glibc-bug
解決方法統一使用一種函數
例如:
wprintf(L"%s","a\n");
wprintf(L"b\n");
或
printf("a\n");
printf("%ls",L"b\n");
關於SIGPIPE導致的程序退出
http://www.cppblog.com/elva/archive/2008/09/10/61544.html
使用yum
在RHEL中,可以使用yum從網上下載相應的組件,但需要RHN號,所以我現在換用了CentOS。當你需要使用yum的時候,如果yum找不到相應的組件時,可以在組件名之前加lib,或者在之後加-dev或-devel。
源碼包編譯4步曲
1)autogen.sh
2)configure
3)make
4)su -c “make install”
其中一二兩步有時只要一個就夠了,如果源碼包中這兩個都有的話,先運行1)
關於ascii字符集的一些打印控制字符的別名
\b——backspace
\f——pagebreak
\v——vertical tab
二進制文件與ASCII、Base64之間的轉換
xxd:這個命令可以將二進制文件轉換成ASCII碼表示文本文件。支持2、8、16等多種進制的ASCII表示形式,還支持輸出成C語言格式的數組聲明。反過來的轉換也同樣支持。
uuencode and uudecode:支持二進制文件與Base64之間的轉換。
start-stop-daemon
該命令用於啟動和停止系統守護程序。
popen
popen()函數通過創建一個管道,調用fork 產生一個子進程,執行一個shell以運行命令來開啟一個進程。也就是說這個函數可以執行shell命令,而且還可以用fread或fgets來獲取命令執行後的輸出結果。
例子如下:
int8_t strcmd[256];
memset(strcmd, 0 , sizeof(strcmd));
sprintf(strcmd, "cat /etc/resolv.conf | awk '{printf $2}'");
pfile = popen(strcmd, "r");
if (pfile != NULL){
int8_t str[64];
bzero(str, sizeof(str));
fgets(str, sizeof(str), pfile);
pclose(pfile);
}
軟件包管理工具
各大linux發行版都有自己的軟件包管理工具。例如:
Debian/Ubuntu | apt-get
Red Hat/Fedora | yum/dnf
SUSE/openSUSE | zypper
Gentoo | emerge
Arch Linux | pacman
各大軟件包管理工具的功能對比,可參見:
https://wiki.archlinux.org/index.php/Pacman/Rosetta
類似的概念也被一些編程語言所使用。例如:
Ruby | RubyGems(gem)
Python | PyPI(pip)
Java | Maven(mvn)
Perl | PPM
Node.js | NPM
PHP | pear
IO多路復用
參考文獻:
/content/3753479.html
select函數
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
函數參數介紹如下:
第一個參數maxfdp1指定待測試的描述字個數,它的值是待測試的最大描述字加1(因此把該參數命名為maxfdp1),描述字0、1、2…maxfdp1-1均將被測試,因為文件描述符是從0開始的。
中間的三個參數readset、writeset和exceptset指定我們要讓內核測試讀、寫和異常條件的描述字。如果對某一個的條件不感興趣,就可以把它設為空指針。struct fd_set可以理解為一個集合,這個集合中存放的是文件描述符,可通過以下四個宏進行設置:
void FD_ZERO(fd_set *fdset); //清空集合
void FD_SET(int fd, fd_set *fdset); //將一個給定的文件描述符加入集合之中
void FD_CLR(int fd, fd_set *fdset); //將一個給定的文件描述符從集合中刪除
int FD_ISSET(int fd, fd_set *fdset); //檢查集合中指定的文件描述符是否可以讀寫
(3)timeout告知內核等待所指定描述字中的任何一個就緒可花多少時間。其timeval結構用於指定這段時間的秒數和微秒數。
這個參數有三種可能:
(1)永遠等待下去:僅在有一個描述字准備好I/O時才返回。為此,把該參數設置為空指針NULL。
(2)等待一段固定時間:在有一個描述字准備好I/O時返回,但是不超過由該參數所指向的timeval結構中指定的秒數和微秒數。
(3)根本不等待:檢查描述字後立即返回,這稱為輪詢。為此,該參數必須指向一個timeval結構,而且其中的定時器值必須為0。
poll函數
`int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 等待的事件 */
short revents; /* 實際發生了的事件 */
} ; `
事件包括:
POLLIN 有數據可讀。
POLLRDNORM 有普通數據可讀。
POLLRDBAND 有優先數據可讀。
POLLPRI 有緊迫數據可讀。
POLLOUT 寫數據不會導致阻塞。
POLLWRNORM 寫普通數據不會導致阻塞。
POLLWRBAND 寫優先數據不會導致阻塞。
POLLMSGSIGPOLL 消息可用。
POLLER 指定的文件描述符發生錯誤。
POLLHUP 指定的文件描述符掛起事件。
POLLNVAL 指定的文件描述符非法。
epoll接口
http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
啟動腳本
Linux啟動時,運行一個叫做init的程序,然後由它來啟動後面的任務,包括多用戶環境,網絡等。
那麼,到底什麼是運行級呢?簡單的說,運行級就是操作系統當前正在運行的功能級別。這個級別從1到6,具有不同的功能。這些級別在/etc/inittab 文件裡指定。這個文件是init程序尋找的主要文件,最先運行的服務是那些放在/etc/rc.d 目錄下的文件。
大多數的Linux發行版本中,啟動的是/etc/rc.d/init.d。這些腳本被ln命令來連接到 /etc/rc.d/rcn.d目錄。(這裡的n就是運行級0-6)
例如/etc/rc.d/rc2.d下面的S10network就是連接到/etc/rc.d/init.d下的network腳本的。
因此,我們可以知道,rc2.d下面的文件就是和運行級2有關的。
文件開頭的S代表start就是啟動服務的意思,後面的數字10就是啟動的順序。例如,在同一個目錄下,你還可以看到 S80postfix這個文件,80就是順序在10以後,因為沒有啟動網絡的情況下,啟動postfix是沒有任何作用的。
再看一下/etc/rc.d/rc3.d,可以看到文件S60nfslock,但是這個文件不存在於/etc/rc.d/rc2.d 目錄下。NFS要用到這個文件,一般用在多用戶環境下,所以放在rc3.d 目錄下。
另外,在/etc/rc.d/rc2.d還可以看到那些K開頭的文件,例如
/etc/rc.d/rc2.d/K45named,K代表kill。
標准的Linux運行級為3或者5,如果是3的話,系統就在多用戶狀態。如果是5的話,則是運行著X Window系統。如果目前正在3或5,而你把運行級降低到2的話,init就會執行K45named腳本。
不同的運行級定義如下:
0 - 停機(千萬不要把initdefault 設置為0 )
1 - 單用戶模式
2 - 多用戶,但是沒有 NFS
3 - 完全多用戶模式
4 - 沒有用到
5 - X11
6 - 重新啟動 (千萬不要把initdefault 設置為6 )
uint8_t
對於要求嚴格位寬的場合,應用程序可以使用uint8_t,uint16_t,uint32_t來獲得移植時的一致性。它的頭文件是inttypes.h。
Linux Shell
空格和TAB的細節
在大多數編程語言中,空格和TAB都不是有意義的字符,有沒有或者有多少都無所謂。但Linux Shell不是這樣的,盡管它看起來並沒有如python那樣的對縮進的強制語言規定。
以下是它在使用空格和TAB時的一些細節:
1.makefile文件中,規則定義部分的shell腳本命令需要使用TAB開頭,使用空格會出錯。
2.if命令的格式:
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
echo "OK, continue"
fi
注意一下上面腳本中的表達式[]之間的部分。其中所使用的空格不可省略,否則會出錯。bash在處理[]表達式的時候,實際上調用了
/usr/bin/[
命令。如果把
[
當作特殊名稱的普通命令的話,就會發現這裡的空格用法實際上並不奇怪。
設置隨機的MAC地址
1.設置MAC地址
ifconfig eth0 hw ether 477265656e00
其中eth0是網口的名稱,477265656e00是要設置的MAC地址(十六進制)。
2.生成隨機數
隨機數的生成在Linux中有多種方法,這裡使用openssl。因為它和MAC都屬於網絡編程的范疇,同時使用的概率較大。
openssl rand -hex 6
3.SIOCSIFHWADDR: Cannot assign requested address錯誤
MAC地址的某些位有特定的含義,並不能隨意設置。仍以477265656e00為例,第一個字節0x47的最後兩位含義如下:
(00)統一管理的單播MAC
(01)統一管理的多播MAC
(10)本地管理的單播MAC
(11)本地管理的多播MAC
由於針對ADSL路由等這樣的網絡終端,一般使用的都是統一管理的單播MAC。
文件操作
這裡列舉一些文件操作的命令,不詳細講解,僅供備忘。
mkfifo:創建命名管道。
remove:刪除文件(包括命名管道)。
access:可查詢文件是否存在及其相關權限。
文件鎖
Linux系統上的文件鎖主要分為協同鎖(advisory lock)和強制鎖(mandatory lock)。前者是應用層鎖,實現方式與信號量相似。後者是內核層鎖。
fcntl和flock都可以用於創建文件鎖。
文件鎖、命名管道和消息隊列的示例代碼:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/pipe/
主線程存續的編程技巧
有的多線程程序,其主要功能實現在其他線程中。主線程只是負責創建這些功能線程,一旦創建完成,自己的使命也就結束了。
如果需要讓主線程在初始化之後,仍然存在,而不是退出的話,可以使用以下技巧:
sigset_t sigs_to_catch;
sigemptyset(&sigs_to_catch);
sigaddset(&sigs_to_catch, SIGINT);
sigwait(&sigs_to_catch, &sig);
這種方法顯然比
while (1);
這樣的忙等待,有效率的多。
Inotify
一種高效、實時的Linux文件系統事件監控框架。參考文檔:
http://www.infoq.com/cn/articles/inotify-linux-file-system-event-monitoring
/usr
usr很多人都認為是user縮寫,其實不然,這是unix system resource的縮寫。