Linux基礎第一章 概述
Linux基礎第一章 概述
第一章 概述
1.1 前言
本章討論系統的概念,從硬體、作業系統角度更加深刻的理解計算機系統,並快速瀏覽Linux系統提供的服務。
1.2 系統組成
1.3 作業系統和應用程式
作業系統這個詞語有二意性,有時候指核心,有時候指核心和系統工具軟體的組合。
作業系統是管理系統硬體的軟體。作業系統是直接執行在裸機之上。其他應用軟體執行在作業系統之上。
作業系統本身提供操作介面,支援使用者通過該介面來操作 系統,但是系統本身提供的功能,不足於完成使用者需求時,則需要開發應用程式來拓展系統功能。
發行版:
不同的公司使用Linux核心,加上自己開發的系統工具軟體,一起釋出的Linux作業系統版本。
1.4 啟動和登陸
配置檔案:
/etc/profile:系統啟動時被執行
~/.bashrc:使用者登陸時會呼叫
1.5 檔案
檔案是一個重要的概念,一般定義為資訊的集合。計算機做為資訊處理的機器,檔案是計算機處理的物件。
在Unix和Linux系統中,泛化了檔案的概念,裝置也被抽象成檔案物件來進行操作。
資料的集合叫做檔案。
IT行業處理資訊:轉換,傳輸,儲存
1.6 程式、程序
1.7 錯誤處理
系統呼叫在一般情況下返回整數,並且0表示成功,小於0表示失敗。當系統呼叫返回失敗時,可以通過errno獲得錯誤嘛,通過strerror獲取錯誤解釋,或者直接通過perror在標準錯誤檔案中,輸出錯誤資訊。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
// 通過open返回的整數,在linux中有個特別的名字
// 叫檔案描述符 file description 簡稱fd
int fd = open("a.txt", O_WRONLY|O_CREAT|O_EXCL, 0777);
if(fd < 0)//表示檔案開啟失敗
{
perror("open");
return 0;
}
// 把指標放到檔案開頭
lseek(fd, 0, SEEK_SET);
// 對檔案進行操作
write(fd, "hello", 5);
// 關閉檔案,如果不關閉,記憶體會洩漏
// 當程序退出時,未關閉的檔案會自動關閉
close(fd);
}
1.8 使用者、組、檔案許可權
Linux是多使用者系統,支援多個使用者同時登陸系統。
為了安全起見,需要對系統的許可權加於規範。
1.9 訊號
訊號是程序通訊的一種手段,某個程序收到訊號,該訊號可能來自核心、來自其它程序或者來自使用者操作。例如:當用戶按下ctrl+c時,其實是給前臺程序傳送了一個訊號。
1.10 系統呼叫和庫函式
學習Linux系統開發介面時,程式設計師也需要學習一般常用的第三方庫,來拓展程式設計師的程式設計能力。
User Space和Kernel Space是作業系統程式設計中常用的概念,表示當前的程式碼在使用者空間還是核心空間執行,對於不同的執行空間,CPU對記憶體的處理方式稍有不同,在講程序虛擬地址空間時再涉及該概念。
系統呼叫指作業系統核心提供的功能,它提供了介面給使用者空間程式碼呼叫。比如open/read/write/close等,都是屬於Linux系統操作介面,而fopen/fread/fwrite/fclose是屬於C標準提供的介面,在Linux下,fopen其實底層呼叫了open。
配置檔案:
/etc/profile:系統啟動時被執行
~/.bashrc:使用者登陸時會呼叫
檔案操作
標頭檔案:sys/types.h sys/stat.h fcntl.h 例:int fd=open(“檔案路徑”,mode); mode決定了對檔案的操作方式 第三個引數可有可無,對檔案許可權進行處理, 因umask存在,建立檔案許可權要與上000 000 010的反,導致使用者許可權開始不能有寫的許可權
mode選項 |
解釋 |
O_RDONLY |
讀方式開啟(與後面倆個互斥) |
O_WRONLY |
寫方式開啟 |
O_RDWR |
讀寫方式開啟 |
O_CREAT |
建立檔案,如果檔案存在,直接開啟 |
O_TRUNC |
截斷 |
O_APPEND |
追加 |
O_EXCL |
和O_CREAT一起用,如果檔案存在則失敗 |
函式:
perror:對某種錯誤資訊進行列印
open/creat:開啟檔案/建立檔案
read:讀檔案
write:寫檔案
close:關閉檔案
lseek:定位檔案讀寫位置
fcntl:修改檔案屬性
sysconf:讀取系統配置
dup/dup2:複製檔案描述符
sync/fsync/fsyncdata:同步檔案資料
mmap/munmap:檔案對映
mkstemp:得到臨時檔案路徑
命令
touch:修改檔案的訪問時間,建立檔案
cat:訪問檔案內容
vim:編輯
ulimit:顯示一些限制資訊(檔案描述符最大值、棧的空間尺寸)
umask:檔案建立的許可權掩碼
getconf:對應sysconf
dd:可以拷貝塊裝置,但是要sudo許可權 例 dd if=位置 of=檔名 bs=一次多少k cout=拷貝次數
Wc:計算檔案的行數 單詞個數 位元組數
unlink:刪除軟連結
訊號
是控制程序通訊的一種方式,效率高,成本低
訊號處理方式:掩蓋、忽略、預設處理
掩碼:延遲訊號的處理 運用訊號集合
掩蓋不可靠訊號,多次傳送,只處理一次 掩蓋:可靠訊號 處理多次
程序
fork()建立
執行緒
滑鼠鍵盤都是隻讀的字元資料夾裝置,所以可以運用函式進行監控 一般在/dev/input/mic 檔案下面 注意許可權問題 滑鼠鍵盤讀取資料,是倆個程序,注意程序的阻塞問題 可以運用字程序和父程序進行處理
執行緒的建立
pthread_created(1,2,3,4) //1:執行緒的id 2:執行緒的的屬性 3:新執行緒的函式名字, 4:新執行緒的屬性 要連結 -lpthread 庫
注意子執行緒是依附主執行緒的,主執行緒結束,子執行緒無法執行 這個pthread_exit(0)主執行緒結束,子執行緒沒有退出例外
運用pthread_equal 判斷執行緒是否相等,先等返回0 不相等返回非零值
pthread_jion(1,&ret) 阻塞呼叫 1:執行緒id ret:執行緒返回值
pthread_t tid = pthread_self() 得到當前執行程序的id
程序和執行緒的區別:
程序:分配資源的單位執行緒:排程的單位多執行緒可以共享全域性變數
鎖
避免倆個執行緒同時操作全域性變數,第一個執行緒運用了鎖,後面的執行緒在外面等,等待解鎖後,後面的執行緒在進來
死鎖
連續倆次加鎖,加鎖後,沒有解鎖,又繼續加鎖,會導致死鎖。 運用迴圈鎖,可以重複加鎖 通過定義鎖的屬性,變為迴圈鎖 例:pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(&mutex,&attr)
加鎖後,忘記解鎖,也會出現死鎖 C++中運用解構函式,可以避免忘記解鎖,定義一個類
讀寫鎖
pthread_rwlock_t mutex;
pthread_rwlock_init(&mutex, NULL);
讀/寫鎖定pthread_rwlock_rd/wrlock(&mutex);
解鎖:pthread_rwlock_unlock(&mutex);
守護程序
守護程序不和終端關聯,注意此程序只能有一個,建立檔案記錄,判斷此程式是否開啟
程式設計規則:
設umask=0;
呼叫fork,讓父程序退出。 讓父程序變為init, 如果父程序不退出,用倆次fork()
呼叫setuid建立新會話 setsid
重設當前目錄/根目錄 chdir
關閉不需要的檔案描述符 運用迴圈關閉所有檔案描述符
高階IO
一個程序就是一段指令
IO複用技術
select的運用
運用檔案描述符集合 運用fd_set建立檔案描述符集合 檔案介面相對較小,跨平臺運用
FD_SET(1,2) 將檔案描述符放入檔案描述符集合 1:檔案描述符 2:集合名字
epoll的運用
epollfd 建立檔案描述符集合
epol_ctl將檔案描述加入集合中
非阻塞IO
管道
一邊讀,一邊寫
匿名管道 pipe()建立管道
mmap 可以實現有親子關係程序的檔案共享 效率低,資料寫入記憶體,在從記憶體中讀取資料 運用shm_open實現檔案共享也可以
檔案記憶體共享,無法進行通訊
通過鎖,讓程序共享記憶體進行通訊 pthread_mutex_init 需要將鎖放在共享記憶體中
fork + exec 讓程序有不同的功能
發表於 2017-05-02 11:46 天碼丶行滿 閱讀(...) 評論(...) 編輯 收藏 重新整理評論重新整理頁面返回頂部