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 讓進程有不同的功能
?
轉載于:https://www.cnblogs.com/w-x-me/p/6394115.html
總結
以上是生活随笔為你收集整理的Linux基础第一章 概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《jQuery、jQuery UI及jQ
- 下一篇: 《NX-OS与Cisco Nexus交换