Linux基础第一章 概述
第一章 概述
1.1 前言
本章討論系統(tǒng)的概念,從硬件、操作系統(tǒng)角度更加深刻的理解計算機系統(tǒng),并快速瀏覽Linux系統(tǒng)提供的服務。
1.2 系統(tǒng)組成
1.3 操作系統(tǒng)和應用程序
操作系統(tǒng)這個詞語有二意性,有時候指內(nèi)核,有時候指內(nèi)核和系統(tǒng)工具軟件的組合。
操作系統(tǒng)是管理系統(tǒng)硬件的軟件。操作系統(tǒng)是直接運行在裸機之上。其他應用軟件運行在操作系統(tǒng)之上。
操作系統(tǒng)本身提供操作接口,支持用戶通過該接口來操作 系統(tǒng),但是系統(tǒng)本身提供的功能,不足于完成用戶需求時,則需要開發(fā)應用程序來拓展系統(tǒng)功能。
發(fā)行版:
不同的公司使用Linux內(nèi)核,加上自己開發(fā)的系統(tǒng)工具軟件,一起發(fā)布的Linux操作系統(tǒng)版本。
1.4 啟動和登陸
配置文件:
/etc/profile:系統(tǒng)啟動時被執(zhí)行
~/.bashrc:用戶登陸時會調(diào)用
1.5 文件
文件是一個重要的概念,一般定義為信息的集合。計算機做為信息處理的機器,文件是計算機處理的對象。
在Unix和Linux系統(tǒng)中,泛化了文件的概念,設備也被抽象成文件對象來進行操作。
數(shù)據(jù)的集合叫做文件。
IT行業(yè)處理信息:轉(zhuǎn)換,傳輸,存儲
1.6 程序、進程
1.7 錯誤處理
系統(tǒng)調(diào)用在一般情況下返回整數(shù),并且0表示成功,小于0表示失敗。當系統(tǒng)調(diào)用返回失敗時,可以通過errno獲得錯誤嘛,通過strerror獲取錯誤解釋,或者直接通過perror在標準錯誤文件中,輸出錯誤信息。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
// 通過open返回的整數(shù),在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);
// 關閉文件,如果不關閉,內(nèi)存會泄漏
// 當進程退出時,未關閉的文件會自動關閉
close(fd);
}
1.8 用戶、組、文件權限
Linux是多用戶系統(tǒng),支持多個用戶同時登陸系統(tǒng)。
為了安全起見,需要對系統(tǒng)的權限加于規(guī)范。
1.9 信號
信號是進程通信的一種手段,某個進程收到信號,該信號可能來自內(nèi)核、來自其它進程或者來自用戶操作。例如:當用戶按下ctrl+c時,其實是給前臺進程發(fā)送了一個信號。
1.10 系統(tǒng)調(diào)用和庫函數(shù)
學習Linux系統(tǒng)開發(fā)接口時,程序員也需要學習一般常用的第三方庫,來拓展程序員的編程能力。
User Space和Kernel Space是操作系統(tǒng)編程中常用的概念,表示當前的代碼在用戶空間還是內(nèi)核空間運行,對于不同的運行空間,CPU對內(nèi)存的處理方式稍有不同,在講進程虛擬地址空間時再涉及該概念。
系統(tǒng)調(diào)用指操作系統(tǒng)內(nèi)核提供的功能,它提供了接口給用戶空間代碼調(diào)用。比如open/read/write/close等,都是屬于Linux系統(tǒng)操作接口,而fopen/fread/fwrite/fclose是屬于C標準提供的接口,在Linux下,fopen其實底層調(diào)用了open。
配置文件:
/etc/profile:系統(tǒng)啟動時被執(zhí)行
~/.bashrc:用戶登陸時會調(diào)用
文件操作
頭文件:sys/types.h ?sys/stat.h ?fcntl.h ?例:int fd=open(“文件路徑”,mode); ?mode決定了對文件的操作方式 ??第三個參數(shù)可有可無,對文件權限進行處理, ??因umask存在,創(chuàng)建文件權限要與上000 000 010的反,導致用戶權限開始不能有寫的權限
| mode選項 | 解釋 |
| O_RDONLY | 讀方式打開(與后面?zhèn)z個互斥) |
| O_WRONLY | 寫方式打開 |
| O_RDWR | 讀寫方式打開 |
| O_CREAT | 創(chuàng)建文件,如果文件存在,直接打開 |
| O_TRUNC | 截斷 |
| O_APPEND | 追加 |
| O_EXCL | 和O_CREAT一起用,如果文件存在則失敗 |
函數(shù):
perror:對某種錯誤信息進行打印
open/creat:打開文件/創(chuàng)建文件
read:讀文件
write:寫文件
close:關閉文件
lseek:定位文件讀寫位置
fcntl:修改文件屬性
sysconf:讀取系統(tǒng)配置
dup/dup2:復制文件描述符
sync/fsync/fsyncdata:同步文件數(shù)據(jù)
mmap/munmap:文件映射
mkstemp:得到臨時文件路徑
命令
touch:修改文件的訪問時間,創(chuàng)建文件
cat:訪問文件內(nèi)容
vim:編輯
ulimit:顯示一些限制信息(文件描述符最大值、棧的空間尺寸)
umask:文件創(chuàng)建的權限掩碼
getconf:對應sysconf
dd:可以拷貝塊設備,但是要sudo權限 ?例 ?dd if=位置 of=文件名 ?bs=一次多少k cout=拷貝次數(shù)
Wc:計算文件的行數(shù) ?單詞個數(shù) 字節(jié)數(shù)
unlink:刪除軟鏈接
?
信號
是控制進程通信的一種方式,效率高,成本低
信號處理方式:掩蓋、忽略、默認處理
掩碼:延遲信號的處理 ?運用信號集合 ??
掩蓋不可靠信號,多次發(fā)送,只處理一次 ??掩蓋:可靠信號 ?處理多次
進程
fork()創(chuàng)建
線程
鼠標鍵盤都是只讀的字符文件夾設備,所以可以運用函數(shù)進行監(jiān)控 ?一般在/dev/input/mic 文件下面 ?注意權限問題 ?鼠標鍵盤讀取數(shù)據(jù),是倆個進程,注意進程的阻塞問題 ?可以運用字進程和父進程進行處理
線程的創(chuàng)建?
?pthread_created(1,2,3,4) //1:線程的id ?2:線程的的屬性 ?3:新線程的函數(shù)名字, 4:新線程的屬性 ???要鏈接 ?-lpthread ?庫 ??
注意子線程是依附主線程的,主線程結(jié)束,子線程無法運行 ? ? 這個?pthread_exit(0)主線程結(jié)束,子線程沒有退出例外
?
運用pthread_equal ?判斷線程是否相等,先等返回0 ?不相等返回非零值
pthread_jion(1,&ret) ?阻塞調(diào)用 1:線程id ?ret:線程返回值
?
pthread_t tid = pthread_self() ?得到當前運行進程的id
進程和線程的區(qū)別:
進程:分配資源的單位??線程:調(diào)度的單位?????多線程可以共享全局變量
鎖
避免倆個線程同時操作全局變量,第一個線程運用了鎖,后面的線程在外面等,等待解鎖后,后面的線程在進來
死鎖
連續(xù)倆次加鎖,加鎖后,沒有解鎖,又繼續(xù)加鎖,會導致死鎖。 運用循環(huán)鎖,可以重復加鎖 ? 通過定義鎖的屬性,變?yōu)檠h(huán)鎖 ?例:pthread_mutexattr_t attr; ?pthread_mutexattr_init(&attr); ?pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(&mutex,&attr)
加鎖后,忘記解鎖,也會出現(xiàn)死鎖 ?C++中運用析構(gòu)函數(shù),可以避免忘記解鎖,定義一個類
?
讀寫鎖
pthread_rwlock_t mutex;
pthread_rwlock_init(&mutex, NULL);
讀/寫鎖定pthread_rwlock_rd/wrlock(&mutex);
解鎖:pthread_rwlock_unlock(&mutex);
?
守護進程
守護進程不和終端關聯(lián),注意此進程只能有一個,創(chuàng)建文件記錄,判斷此程序是否開啟
編程規(guī)則:
設umask=0;
調(diào)用fork,讓父進程退出。 ???讓父進程變?yōu)?/span>init, ?如果父進程不退出,用倆次fork()
調(diào)用setuid創(chuàng)建新會話 ?setsid
重設當前目錄/根目錄 ????chdir ???????
關閉不需要的文件描述符 ???運用循環(huán)關閉所有文件描述符
高級IO
一個進程就是一段指令
IO復用技術
select的運用
運用文件描述符集合 ?運用fd_set創(chuàng)建文件描述符集合 ?文件接口相對較小,跨平臺運用
FD_SET(1,2) 將文件描述符放入文件描述符集合 ?1:文件描述符 ?2:集合名字
epoll的運用
epollfd ?創(chuàng)建文件描述符集合
epol_ctl將文件描述加入集合中
非阻塞IO
?
管道
一邊讀,一邊寫
匿名管道 ?pipe()創(chuàng)建管道
?
?
mmap ?可以實現(xiàn)有親子關系進程的文件共享 ?效率低,數(shù)據(jù)寫入內(nèi)存,在從內(nèi)存中讀取數(shù)據(jù) ?運用shm_open實現(xiàn)文件共享也可以
文件內(nèi)存共享,無法進行通信
?
通過鎖,讓進程共享內(nèi)存進行通信 ?pthread_mutex_init ?需要將鎖放在共享內(nèi)存中 ?
?
fork ?+ ?exec 讓進程有不同的功能
?
轉(zhuǎn)載于:https://www.cnblogs.com/w-x-me/p/6394115.html
總結(jié)
以上是生活随笔為你收集整理的Linux基础第一章 概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《jQuery、jQuery UI及jQ
- 下一篇: linux 其他常用命令