日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux学习心得(一)

發(fā)布時間:2023/12/20 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux学习心得(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://antkillerfarm.github.io/

GUI設(shè)計工具

GTK+的程序可以使用Glade來設(shè)計界面,它會生成一個腳本,運(yùn)行該腳本,并make就行了。

QT的稍微麻煩一些。

1)首先打開QT Designer(新建時,不能使用KDE Designer,但修改建好后的工程可以,不知道是BUG,還是怎么回事)新建一個窗體,然后新建一個main.cpp,并將剛才生成的窗體選為主窗體。

2)打開KDev C/C++,選擇導(dǎo)入工程,選擇QMake Based導(dǎo)入,然后即可在IDE中編譯并運(yùn)行。

上面寫的兩個都是官方的設(shè)計器,而WxWidgets沒有官方的設(shè)計器,但有很多第三方的設(shè)計器,我使用的是免費(fèi)且開源的wxFormBuilder。用它可生成XRC文件,而WxWidgets中有使用XRC文件的接口。

編程所用命令簡介

cc:C/C++編譯器

as:GNU匯編編譯器

ld:鏈接器

as86、ld86:8086匯編編譯器和鏈接器

linux文件分割用split,合并用cat。最近下了一本采用split分割的書,但是我沒有Linux環(huán)境,于是在windows的命令行下用type、>、>>合并了文件。

printf和wprintf混用的問題

在linux中不可混用printf和wprintf,如果混用的話,則后使用的函數(shù)沒有輸出。

例如

printf("a\n");
wprintf(L"b\n");

輸出為:

a

wprintf(L"b\n");
printf("a\n");

輸出為:

b

關(guān)于這個問題的討論見

http://bytes.com/groups/c/852681-wprintf-conflicts-printf-glibc-bug

解決方法統(tǒng)一使用一種函數(shù)

例如:

wprintf(L"%s","a\n");
wprintf(L"b\n");

printf("a\n");
printf("%ls",L"b\n");

關(guān)于SIGPIPE導(dǎo)致的程序退出

http://www.cppblog.com/elva/archive/2008/09/10/61544.html

使用yum

在RHEL中,可以使用yum從網(wǎng)上下載相應(yīng)的組件,但需要RHN號,所以我現(xiàn)在換用了CentOS。當(dāng)你需要使用yum的時候,如果yum找不到相應(yīng)的組件時,可以在組件名之前加lib,或者在之后加-dev或-devel。

源碼包編譯4步曲

1)autogen.sh

2)configure

3)make

4)su -c “make install”

其中一二兩步有時只要一個就夠了,如果源碼包中這兩個都有的話,先運(yùn)行1)

關(guān)于ascii字符集的一些打印控制字符的別名

\b——backspace

\f——pagebreak

\v——vertical tab

二進(jìn)制文件與ASCII、Base64之間的轉(zhuǎn)換

xxd:這個命令可以將二進(jìn)制文件轉(zhuǎn)換成ASCII碼表示文本文件。支持2、8、16等多種進(jìn)制的ASCII表示形式,還支持輸出成C語言格式的數(shù)組聲明。反過來的轉(zhuǎn)換也同樣支持。

uuencode and uudecode:支持二進(jìn)制文件與Base64之間的轉(zhuǎn)換。

start-stop-daemon

該命令用于啟動和停止系統(tǒng)守護(hù)程序。

popen

popen()函數(shù)通過創(chuàng)建一個管道,調(diào)用fork 產(chǎn)生一個子進(jìn)程,執(zhí)行一個shell以運(yùn)行命令來開啟一個進(jìn)程。也就是說這個函數(shù)可以執(zhí)行shell命令,而且還可以用fread或fgets來獲取命令執(zhí)行后的輸出結(jié)果。

例子如下:

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發(fā)行版都有自己的軟件包管理工具。例如:

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多路復(fù)用

參考文獻(xiàn):

http://www.cnblogs.com/Anker/p/3265058.html

select函數(shù)

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)

函數(shù)參數(shù)介紹如下:

第一個參數(shù)maxfdp1指定待測試的描述字個數(shù),它的值是待測試的最大描述字加1(因此把該參數(shù)命名為maxfdp1),描述字0、1、2…maxfdp1-1均將被測試,因為文件描述符是從0開始的。

中間的三個參數(shù)readset、writeset和exceptset指定我們要讓內(nèi)核測試讀、寫和異常條件的描述字。如果對某一個的條件不感興趣,就可以把它設(shè)為空指針。struct fd_set可以理解為一個集合,這個集合中存放的是文件描述符,可通過以下四個宏進(jìn)行設(shè)置:

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告知內(nèi)核等待所指定描述字中的任何一個就緒可花多少時間。其timeval結(jié)構(gòu)用于指定這段時間的秒數(shù)和微秒數(shù)。

這個參數(shù)有三種可能:

(1)永遠(yuǎn)等待下去:僅在有一個描述字準(zhǔn)備好I/O時才返回。為此,把該參數(shù)設(shè)置為空指針NULL。

(2)等待一段固定時間:在有一個描述字準(zhǔn)備好I/O時返回,但是不超過由該參數(shù)所指向的timeval結(jié)構(gòu)中指定的秒數(shù)和微秒數(shù)。

(3)根本不等待:檢查描述字后立即返回,這稱為輪詢。為此,該參數(shù)必須指向一個timeval結(jié)構(gòu),而且其中的定時器值必須為0。

poll函數(shù)

`int poll ( struct pollfd * fds, unsigned int nfds, int timeout);

struct pollfd {
int fd; /* 文件描述符 */
short events; /* 等待的事件 */
short revents; /* 實際發(fā)生了的事件 */
} ; `

事件包括:

POLLIN         有數(shù)據(jù)可讀。
POLLRDNORM      有普通數(shù)據(jù)可讀。
POLLRDBAND      有優(yōu)先數(shù)據(jù)可讀。
POLLPRI         有緊迫數(shù)據(jù)可讀。
POLLOUT       寫數(shù)據(jù)不會導(dǎo)致阻塞。
POLLWRNORM      寫普通數(shù)據(jù)不會導(dǎo)致阻塞。
POLLWRBAND      寫優(yōu)先數(shù)據(jù)不會導(dǎo)致阻塞。
POLLMSGSIGPOLL     消息可用。
POLLER   指定的文件描述符發(fā)生錯誤。
POLLHUP   指定的文件描述符掛起事件。
POLLNVAL  指定的文件描述符非法。

epoll接口

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html

啟動腳本

Linux啟動時,運(yùn)行一個叫做init的程序,然后由它來啟動后面的任務(wù),包括多用戶環(huán)境,網(wǎng)絡(luò)等。

那么,到底什么是運(yùn)行級呢?簡單的說,運(yùn)行級就是操作系統(tǒng)當(dāng)前正在運(yùn)行的功能級別。這個級別從1到6,具有不同的功能。這些級別在/etc/inittab 文件里指定。這個文件是init程序?qū)ふ业闹饕募?#xff0c;最先運(yùn)行的服務(wù)是那些放在/etc/rc.d 目錄下的文件。

大多數(shù)的Linux發(fā)行版本中,啟動的是/etc/rc.d/init.d。這些腳本被ln命令來連接到 /etc/rc.d/rcn.d目錄。(這里的n就是運(yùn)行級0-6)

例如/etc/rc.d/rc2.d下面的S10network就是連接到/etc/rc.d/init.d下的network腳本的。

因此,我們可以知道,rc2.d下面的文件就是和運(yùn)行級2有關(guān)的。

文件開頭的S代表start就是啟動服務(wù)的意思,后面的數(shù)字10就是啟動的順序。例如,在同一個目錄下,你還可以看到 S80postfix這個文件,80就是順序在10以后,因為沒有啟動網(wǎng)絡(luò)的情況下,啟動postfix是沒有任何作用的。

再看一下/etc/rc.d/rc3.d,可以看到文件S60nfslock,但是這個文件不存在于/etc/rc.d/rc2.d 目錄下。NFS要用到這個文件,一般用在多用戶環(huán)境下,所以放在rc3.d 目錄下。

另外,在/etc/rc.d/rc2.d還可以看到那些K開頭的文件,例如

/etc/rc.d/rc2.d/K45named,K代表kill。

標(biāo)準(zhǔn)的Linux運(yùn)行級為3或者5,如果是3的話,系統(tǒng)就在多用戶狀態(tài)。如果是5的話,則是運(yùn)行著X Window系統(tǒng)。如果目前正在3或5,而你把運(yùn)行級降低到2的話,init就會執(zhí)行K45named腳本。

不同的運(yùn)行級定義如下:

0 - 停機(jī)(千萬不要把initdefault 設(shè)置為0 )
1 - 單用戶模式
2 - 多用戶,但是沒有 NFS
3 - 完全多用戶模式
4 - 沒有用到
5 - X11
6 - 重新啟動 (千萬不要把initdefault 設(shè)置為6 )

uint8_t

對于要求嚴(yán)格位寬的場合,應(yīng)用程序可以使用uint8_t,uint16_t,uint32_t來獲得移植時的一致性。它的頭文件是inttypes.h。

Linux Shell

空格和TAB的細(xì)節(jié)

在大多數(shù)編程語言中,空格和TAB都不是有意義的字符,有沒有或者有多少都無所謂。但Linux Shell不是這樣的,盡管它看起來并沒有如python那樣的對縮進(jìn)的強(qiáng)制語言規(guī)定。

以下是它在使用空格和TAB時的一些細(xì)節(jié):

1.makefile文件中,規(guī)則定義部分的shell腳本命令需要使用TAB開頭,使用空格會出錯。

2.if命令的格式:

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
echo "OK, continue"
fi

注意一下上面腳本中的表達(dá)式[]之間的部分。其中所使用的空格不可省略,否則會出錯。bash在處理[]表達(dá)式的時候,實際上調(diào)用了/usr/bin/[命令。如果把[當(dāng)作特殊名稱的普通命令的話,就會發(fā)現(xiàn)這里的空格用法實際上并不奇怪。

設(shè)置隨機(jī)的MAC地址

1.設(shè)置MAC地址

ifconfig eth0 hw ether 477265656e00

其中eth0是網(wǎng)口的名稱,477265656e00是要設(shè)置的MAC地址(十六進(jìn)制)。

2.生成隨機(jī)數(shù)

隨機(jī)數(shù)的生成在Linux中有多種方法,這里使用openssl。因為它和MAC都屬于網(wǎng)絡(luò)編程的范疇,同時使用的概率較大。

openssl rand -hex 6

3.SIOCSIFHWADDR: Cannot assign requested address錯誤

MAC地址的某些位有特定的含義,并不能隨意設(shè)置。仍以477265656e00為例,第一個字節(jié)0x47的最后兩位含義如下:

(00)統(tǒng)一管理的單播MAC

(01)統(tǒng)一管理的多播MAC

(10)本地管理的單播MAC

(11)本地管理的多播MAC

由于針對ADSL路由等這樣的網(wǎng)絡(luò)終端,一般使用的都是統(tǒng)一管理的單播MAC。

文件操作

這里列舉一些文件操作的命令,不詳細(xì)講解,僅供備忘。

mkfifo:創(chuàng)建命名管道。

remove:刪除文件(包括命名管道)。

access:可查詢文件是否存在及其相關(guān)權(quán)限。

文件鎖

Linux系統(tǒng)上的文件鎖主要分為協(xié)同鎖(advisory lock)和強(qiáng)制鎖(mandatory lock)。前者是應(yīng)用層鎖,實現(xiàn)方式與信號量相似。后者是內(nèi)核層鎖。

fcntl和flock都可以用于創(chuàng)建文件鎖。

文件鎖、命名管道和消息隊列的示例代碼:

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/pipe/

主線程存續(xù)的編程技巧

有的多線程程序,其主要功能實現(xiàn)在其他線程中。主線程只是負(fù)責(zé)創(chuàng)建這些功能線程,一旦創(chuàng)建完成,自己的使命也就結(jié)束了。

如果需要讓主線程在初始化之后,仍然存在,而不是退出的話,可以使用以下技巧:

sigset_t sigs_to_catch;
sigemptyset(&sigs_to_catch);
sigaddset(&sigs_to_catch, SIGINT);
sigwait(&sigs_to_catch, &sig);

這種方法顯然比while (1);這樣的忙等待,有效率的多。

Inotify

一種高效、實時的Linux文件系統(tǒng)事件監(jiān)控框架。參考文檔:

http://www.infoq.com/cn/articles/inotify-linux-file-system-event-monitoring

/usr

usr很多人都認(rèn)為是user縮寫,其實不然,這是unix system resource的縮寫。

總結(jié)

以上是生活随笔為你收集整理的linux学习心得(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。