1. 程式人生 > 實用技巧 >Linux基礎第一章 概述

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(1234) //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_SET12) 將檔案描述符放入檔案描述符集合 1:檔案描述符 2:集合名字

epoll的運用

epollfd 建立檔案描述符集合

epol_ctl將檔案描述加入集合中

非阻塞IO

管道

一邊讀,一邊寫

匿名管道 pipe()建立管道

mmap 可以實現有親子關係程序的檔案共享 效率低,資料寫入記憶體,在從記憶體中讀取資料 運用shm_open實現檔案共享也可以

檔案記憶體共享,無法進行通訊

通過鎖,讓程序共享記憶體進行通訊 pthread_mutex_init 需要將鎖放在共享記憶體中

fork + exec 讓程序有不同的功能

發表於 2017-05-02 11:46 天碼丶行滿 閱讀(...) 評論(...) 編輯 收藏 重新整理評論重新整理頁面返回頂部