① linux系統中,用戶自定義變數的定義和使用方法與c語言有何異同
變數定義和使用基本相同。都是按照C語言標準的。命名規范可能有點差別,linux系統中,通常用小寫的字母、單詞, Windows中C語言通常首字母大寫。
② Linux下C/C++動態庫在運行時是怎樣載入進來的
在linux上,你在ps中說的那種"將動態庫作為一個參數傳到程序里"的使用方式,是通過dlopen函數將.so載入到當前進程中,並且通過ld.so將.so"鏈接"進當前進程。這個"鏈接"過程包括:查找未定義符號在當前進程中的地址、分配數據/代碼/bss段內存(數據初始化全局變數、代碼段重定位)、執行constructor函數等。之後,可以使用dlsym在已知符號名的情況下通過符號名查找符號對應的地址。這個符號可以是一個全局變數、全局函數等。在你說的C++中,重載的函數也可以理解為全局函數,會有一個屬性為weak的符號。該符號的符號名如果不做修改,默認按照System V的C++ API命名規范命名(以保證linux下不同編譯器編譯出來的.so和.o可以通用)。但如果使用extern "C"修飾之後,變成C的函數名,則無名稱修飾,便於使用。
作者:yin jie
鏈接:https://www.hu.com/question/29988788/answer/46352593
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
③ Linux中如何創建靜態庫和動態庫
靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。 動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include void hello(const char *name) { printf("Hello %s!\n", name); } 程序3: main.c #include "hello.h" int main() { hello("everyone"); return 0; } 無論動態庫還是靜態庫都需要用到.o文件來生成,先編譯生成.o文件。 # gcc -c hello.c 1:創建靜態庫 靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。 # ar cr libmyhello.a hello.o 使用靜態庫:只需要在你的源程序中加入包含你所需要使用到的函數的聲明(即包含頭文件),然後在gcc生成目標文件時候指明靜態庫就OK了(除非你包含的頭文件在/usr/include,庫文件在標准庫/usr/lib,/lib下,否則你得顯示指明他們的路徑) # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone! 刪除靜態庫文件運行./hello,程序正常運行,說明靜態庫公用函數已經鏈接到目標文件。 2: 利用.o文件創建動態庫 動態庫文件擴展名為.so。 # gcc -shared -fPCI -o libmyhello.so hello.o 動態庫的使用與靜態庫使用方式一樣 # gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory 哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。
④ linux系統中設備文件命名的規則是什麼
在基於Linux的系統中,設備節點一般在/dev下,通常使用如下的前綴:
fb:frame緩沖
fd:軟盤
hd:IDE硬碟
lp:打版印機
par:並口
pt:偽終權端
s:SCSI設備
scd:SCSI音頻光碟機
sd:SCSI硬碟
sg:SCSI通用設備
sr:SCSI數據光碟機
st:SCSI磁帶
tty:終端
ttyS:串口
大部分設備的前綴名後面跟隨一個數字,它唯一指定某一設備。硬碟驅動器的前綴名後面跟隨一個字母和一個數字,字母用於指明設備,而數字用於指明分區。因此,/dev/sda3指定了硬碟上的一個分區,/dev/pts/14指定了一個網路終端會話。
一些Linux發行版用SCSI層訪問所有固定硬碟,因此雖然一塊硬碟可能並不是SCSI硬碟,但仍可以通過sd設備訪問它。
⑤ C語言命名規范
匈牙利命名法是微軟推廣的一種關於變數、函數、對象、前綴、宏定義等各種類型的符號的命名規范。匈牙利命名法的主要思想是:在變數和函數名中加入前綴以增進人們對程序的理解。它是由微軟內部的一個匈牙利人發起使用的,結果它在微軟內部逐漸流行起來,並且推廣給了全世界的Windows開發人員。下面將介紹匈牙利命名法,後面的例子里也會盡量遵守它和上面的代碼風格。還是那句話,並不是要求所有的讀者都要去遵守,但是希望讀者作為一個現代的軟體開發人員都去遵守它。
a Array 數組
b BOOL (int) 布爾(整數)
by Unsigned Char (Byte) 無符號字元(位元組)
c Char 字元(位元組)
cb Count of bytes 位元組數
cr Color reference value 顏色(參考)值
cx Count of x (Short) x的集合(短整數)
dw DWORD(unsigned long) 雙字(無符號長整數)
f Flags (usually multiple bit values) 標志(一般是有多位的數值)
fn Function 函數
g_ global 全局的
h Handle 句柄
i Integer 整數
l Long 長整數
lp Long pointer 長指針
m_ Data member of a class 一個類的數據成員
n Short int 短整數
p Pointer 指針
s String 字元串
sz Zero terminated String 以0結尾的字元串
tm Text metric 文本規則
u Unsigned int 無符號整數
ul Unsigned long (ULONG) 無符號長整數
w WORD (unsigned short) 無符號短整數
x,y x, y coordinates (short) 坐標值/短整數
v void 空
有關項目的全局變數用g_開始,類成員變數用m_,局部變數若函數較大則可考慮用l_用以顯示說明其是局部變數。
前綴 類型 例子
g_ 全局變數 g_Servers
C 類或者結構體 CDocument,CPrintInfo
m_ 成員變數 m_pDoc,m_nCustomers
VC常用前綴列表:
前綴 類型 描述 例子
ch char 8位字元 chGrade
ch TCHAR 16位UNICODE類型字元 chName
b BOOL 布爾變數 bEnabled
n int 整型(其大小由操作系統決定) nLength
n UINT 無符號整型(其大小由操作系統決定) nLength
w WORD 16位無符號整型 wPos
l LONG 32位有符號整型 lOffset
dw DWORD 32位無符號整型 dwRange
p * Ambient memory model pointer 內存模塊指針,指針變數 pDoc
lp FAR* 長指針 lpDoc
lpsz LPSTR 32位字元串指針 lpszName
lpsz LPCSTR 2位常量字元串指針 lpszName
lpsz LPCTSTR 32位UNICODE類型常量指針 lpszName
h handle Windows對象句柄 hWnd
lpfn (*fn)() 回調函數指針 Callback Far pointer to CALLBACK function lpfnAbort
⑥ linux文件名的命名遵行什麼規則
cp命令用於復制文件或目錄,格式為:「cp [選項] 源文件 目標文件」。
復制命令的三種情況:
目標文件是一個目錄,會將源文件復制到該目錄中。
目標文件是一個文件,會將源文件覆蓋該文件。
目標文件不存在,將會復制源文件並修改為目標文件的名稱(重命名)。
參數 作用
-p 保留原始文件的屬性
-d 若對象為"鏈接文件",則保留該"鏈接文件"的屬性
-r 遞歸持續復制(用於目錄)
-i 若目標文件存在則詢問是否覆蓋
-a 相當於-pdr(p,d,r為上述的參數)
創建一個名為install.log的文件:
[root@linuxprobe ~]# touch install.log
將install.log復制為x.log:
[root@linuxprobe ~]# cp install.log x.log
查看到確實出現了文件x.log
[root@linuxprobe ~]# ls
install.log x.log
mv命令用於移動文件或改名,格式為:「mv [選項] 文件名 [目標路徑|目標文件名]」。
將文件aaa重命名為bbb:
[root@linuxprobe ~]# mv aaa bbb
網路搜索《linux就該這么學》,
第2章 新手必須掌握的Linux命令,有最基本的命令,可以看下。
⑦ linux內核版本變少
Linux內核版本命名在不同時期有著不同的規范,在涉及到Linux版本問題時經常容易混淆,主線版本/穩定版/長期支持版本經常搞不清楚,本文主要記錄下內核版本命名的規則以及如何查看Linux系統版本信息。
Linux內核(Linux kernel)簡介
內核是操作系統的核心 ,其主要功能有:
響應中斷,執行中斷服務程序
管理多個進程,調度和分享處理器的時間
管理進程地址空間的內存管理
網路和進程間通信等系統服務程序
內核的活動范圍:
1.運行於用戶空間,執行用戶進程
2.運行於內核空間,處於進程上下文,代表某個特定進程的執行
3.運行於內核空間,處於中斷上下文,與任何進程無關,處理某個特定的中斷
Linux內核版本號
第一種方式:
Linux 的版本號分為兩部分,即內核版本與發行版本。內核版本號由3個數字組成:A.B.C。各數字含義如下:
A:內核主版本號。這是很少發生變化,只有當發生重大變化的代碼和內核發生才會發生。在歷史上曾改變兩次的內核:1994年的1.0及1996年的2.0。
B:內核次版本號。是指一些重大修改的內核。偶數表示穩定版本;奇數表示開發中版本。
C:內核修訂版本號。是指輕微修訂的內核。這個數字當有安全補丁,bug修復,新的功能或驅動程序,內核便會有變化。
第二種方式:
major.minor.patch-build.desc
major : 主版本號,有結構變化才變更
minor : 次版本號,新增功能時才發生變化,一般技術表示測試版,偶數表示生產版
patch : 補丁包數或次版本的修改次數
build : 編譯(或構建)的次數,每次編譯可能對少量程序做優化或修改,但一般沒有大的(可控的)功能變化。
desc : 當前版本的特殊信息,其信息由編譯時指定,具有較大的隨意性,有如下的標識是常用的:
rc(或r),表示發行候選版本(release candidate),rc後的數字表示該正式版本的第幾個候選版本,多數情況下,各候選版本之間數字越大越接近正式版。
smp,表示對稱多處理器(Symmetric MultiProcessing)。
pp,在Red Hat Linux中常用來表示測試版本(pre-patch)。
EL,在Red Hat Linux中用來表示企業版Linux(Enterprise Linux)。
mm,表示專門用來測試新的技術或新功能的版本。
fc,在Red Hat Linux中表示Fedora Core。
例如:
用命令uname -a查看內核版本號
1、在CentOS下如:
Linux localhost 2.6.32-642.15.1.el6.x86_64 #1 SMP Fri Feb 24 14:31:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
說明如下:
第一個組數字:2, 主版本號
第二個組數字:6, 次版本號,當前為穩定版本
第三個組數字:32, 修訂版本號
第四個組數字:642.15.1,表示發型版本的補丁版本
el6:則表示我正在使用的內核是 RedHat / CentOS 系列發行版專用內核
x86_64:採用的是64位的CPU
2、在Ubuntu下如:
Linux localhost 3.2.0-67-generic #101-Ubuntu SMP Tue Jul 15 17:46:11 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
#有的是3.2.0-67-generic-pae
說明如下:
第一個組數字:3,主版本號
第二個組數字:2,次版本號,當前為穩定版本
第三個組數字:0,修訂版本號
第四個組數字:67,當前內核版本(3.2.0)的第67次微調patch
generic:當前內核版本為通用版本,另有表示不同含義的server(針對伺服器)、i386(針對老式英特爾處理器)
pae(PhysicalAddressExtension):物理地址擴展,為了彌補32位地址在PC伺服器應用上的不足而推出,表示此32位系統可以支持超過4G的內存
x86_64:採用的是64位的CPU
SMP:對稱多處理機,表示內核支持多核、多處理器
TueJul1517:46:11UTC2014:內核的編譯時間(builddate)為2014/07/1517:46:11
有好東西,一定想著大家。我是愛分享的Linux技術狂。大家記得關注我,也不要忘記點贊、評論、收藏。
同時也可以點擊 正在跳轉 我們在這里一起學習、一起進步,或者點擊 C/C++Linux伺服器開發/後台架構師 免費訂閱一下,多一點知識,多一份收獲,更多一點工資。
更多關於內核的視頻干貨:
嗶哩嗶哩 ( ゜- ゜)つロ 乾杯~ Bilibili
內核版本分類
Linux內核版本的最新發布狀態,參見Linux官網:
The Linux Kernel Archives
1、mainline
主線版本
2、stable
穩定版,由mainline在時機成熟時發布,穩定版也會在相應版本號的主線上提供bug修復和安全補丁,但內核社區人力有限,因此較老版本會停止維護,而標記為EOL(End of Life)的版本表示不再支持的版本。
3、longterm(Long Term Support)
長期支持版,長期支持版的內核不再支持時會標記EOL。
4、linux-next,snapshot
代碼提交周期結束之前生成的快照 用於給Linux代碼貢獻者們做測試
查看Linux內核版本命令
1、cat /proc/version
[root@bogon ~]# cat /proc/version
Linux version 4.4.131-1.el7.elrepo.x86_64 (mockbuild@Build64R7) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed May 2 13:09:02 EDT 2018
2、uname -a
[root@bogon ~]# uname -a
Linux bogon 4.4.131-1.el7.elrepo.x86_64 #1 SMP Wed May 2 13:09:02 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@bogon ~]# uname -r
4.4.131-1.el7.elrepo.x86_64
查看Linux系統版本的命令
1、lsb_release -a(適用於所有的Linux發行版本)
LSB是Linux Standard Base的縮寫,lsb_release命令用來顯示LSB和特定版本的相關信息。如果使用該命令時不帶參數,則默認加上-v參數。
說明:
-v 顯示版本信息。
-i 顯示發行版的id。
-d 顯示該發行版的描述信息。
-r 顯示當前系統是發行版的具體版本號。
-c 發行版代號。
-a 顯示上面的所有信息。
-h 顯示幫助信息。
-s 輸出簡短的描述信息(僅限於redhat和fedora系統) 。
有些系統中默認並沒有安裝lsb_release,需要進行安裝,以CentOS為例:
首先查找lsb_release安裝包:
[root@bogon ~]# yum provides lsb_release
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.cn99.com
* elrepo: mirrors.tuna.tsinghua.e.cn
* extras: centos.ustc.e.cn
* updates: mirrors.cn99.com
redhat-lsb-core-4.1-27.el7.centos.1.x86_64 : LSB Core mole support
Repo : base
Matched from:
Filename : /usr/bin/lsb_release
安裝:
[root@bogon ~]# yum install -y redhat-lsb-core
2、cat /etc/redhat-release(適用於Redhat系的Linux)
[root@bogon ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
3、cat /etc/issue(適用於所有的Linux發行版本)
root@localhost:~# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
本文作者: Jason hu
本文轉自鏈接: http://jasonhzy.github.io/2019/02/05/linux-kernel-version/
版權聲明:本文採用 CC BY-NC-SA 3.0 許可協議。
展開閱讀全文