在linux命令中reboot是從新啓動,shutdown -r now是當即中止而後從新啓動,都說他們兩個是同樣的,實際上是有必定的區別的。
shutdown命令能夠安全地關閉或重啓Linux系統,它在系統關閉以前給系統上的全部登陸用戶提示一條警告信息。該命令還容許用戶指定一個時間參數,能夠是一個精確的時間,也能夠是從如今開始的一個時間段。
精確時間的格式是hh:mm,表示小時和分鐘,時間段由+ 和分鐘數表示。系統執行該命令後會自動進行數據同步的工做。
該命令的通常格式: shutdown [選項] [時間] [警告信息]
命令中各選項的含義爲:
- k 並不真正關機而只是發出警告信息給全部用戶
- r 關機後當即從新啓動
- h 關機後不從新啓動
- f 快速關機重啓動時跳過fsck
- n 快速關機不通過init 程序
- c 取消一個已經運行的shutdown
須要特別說明的是該命令只能由超級用戶使用。
例1,系統在十分鐘後關機而且立刻從新啓動: # shutdown –r +10
例2,系統立刻關機而且不從新啓動:# shutdown –h now
halt是最簡單的關機命令,其其實是調用shutdown -h命令。halt執行時,殺死應用進程,文件系統寫操做完成後就會中止內核。
halt命令的部分參數以下:
[-f] 沒有調用shutdown而強制關機或重啓
[-i] 關機或從新啓動以前,關掉全部的網絡接口
[-p] 關機時調用poweroff,此選項爲缺省選項html
reboot的工做過程與halt相似,其做用是從新啓動,而halt是關機。其參數也與halt相似。reboot命令重啓動系統時是刪除全部的進程,而不是平穩地終止它們。所以,使用reboot命令能夠快速地關閉系統,但若是還有其它用戶在該系統上工做時,就會引發數據的丟失。因此使用reboot命令的場合主要是在單用戶模式。
init是全部進程的祖先,其進程號始終爲1。init用於切換系統的運行級別,切換的工做是當即完成的。init 0命令用於當即將系統運行級別切換爲0,即關機;init 6命令用於將系統運行級別切換爲6,即從新啓動。linux
代碼段:代碼段是用來存放可執行文件的操做指令,也就是說是它是可執行程序在內存中的鏡像。代碼段須要防止在運行時被非法修改,因此只准許讀取操做,而不容許寫入(修改)操做—它是不可寫的。
數據段:數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。
BSS段:BSS段包含了程序中未初始化的全局變量,在內存中bss段所有置零。
堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)。
棧:棧是用戶存放程序臨時建立的局部變量,也就是說咱們函數括弧「{}」中定義的變量(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此之外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,而且待到調用結束後,函數的返回值也會被存放回棧中。因爲棧的先進後出特色,因此棧特別方便用來保存/恢復調用現場。從這個意義上講,咱們能夠把堆棧當作一個寄存、交換臨時數據的內存區。面試
爲了更加安全的存儲文件,Linux爲不一樣的文件賦予了不一樣的權限,每一個文件都擁有下面三種權限:
● 全部者權限:文件全部者可以進行的操做。
● 組權限:文件所屬用戶組可以進行的操做。
● 外部權限(其餘權限):其餘用戶能夠進行的操做。
查看文件權限:
ls -l 命令能夠查看與文件權限相關的信息:算法
$ls -l /home/amrood -rwxr-xr-- 1 amrood users 1024 Nov 2 00:10 myfile drwxr-xr--- 1 amrood users 1024 Nov 2 00:10 mydir
第一列就包含了文件或目錄的權限。 安全
第一列的字符能夠分爲三組,每一組有三個,每一個字符都表明不一樣的權限,分別爲讀取(r)、寫入(w)和執行(x):
· 第一組字符(2-4)表示文件全部者的權限,-rwxr-xr-- 表示全部者擁有讀取(r)、寫入(w)和執行(x)的權限。
· 第二組字符(5-7)表示文件所屬用戶組的權限,-rwxr-xr-- 表示該組擁有讀取(r)和執行(x)的權限,但沒有寫入權限。
· 第三組字符(8-10)表示全部其餘用戶的權限,rwxr-xr-- 表示其餘用戶只能讀取(r)文件。
文件訪問模式:
文件權限是Linux系統的第一道安全防線,基本的權限有讀取(r)、寫入(w)和執行(x):
· 讀取:用戶可以讀取文件信息,查看文件內容。
· 寫入:用戶能夠編輯文件,能夠向文件寫入內容,也能夠刪除文件內容。
· 執行:用戶能夠將文件做爲程序來運行。
目錄訪問模式:
目錄的訪問模式和文件相似,可是稍有不一樣:
· 讀取:用戶能夠查看目錄中的文件
· 寫入:用戶能夠在當前目錄中刪除文件或建立文件
· 執行:執行權限賦予用戶遍歷目錄的權利,例如執行 cd 和 ls 命令。網絡
改變權限:
chmod (change mode) 命令來改變文件或目錄的訪問權限,權限可使用符號或數字來表示。
使用符號表示權限:
能夠增長(+)和刪除(-)權限,也能夠指定特定權限。
符號說明:
+ 爲文件或目錄增長權限
- 刪除文件或目錄的權限
= 設置指定的權限
下面的例子將會修改testfile文件的權限:函數
$ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile $chmod o+wx testfile $ls -l testfile -rwxrwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod u-x testfile $ls -l testfile -rw-rwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod g=rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile
也能夠同時使用多個符號:spa
$chmod o+wx,u-x,g=rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile
使用數字表示權限:
除了符號,也可使用八進制數字來指定具體權限,以下表所示:
數字權限說明:
0 沒有任何權限 ---
1 執行權限 --x
2 寫入權限 -w-
3 執行權限和寫入權限:1 (執行) + 2 (寫入) = 3 -wx
4 讀取權限 r--
5 讀取和執行權限:4 (讀取) + 1 (執行) = 5 r-x
6 讀取和寫入權限:4 (讀取) + 2 (寫入) = 6 rw-
7 全部權限: 4 (讀取) + 2 (寫入) + 1 (執行) = 7 rwx設計
下面的例子,首先使用 ls -1 命令查看testfile文件的權限,而後使用chmod命令更改權限:htm
$ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile $ chmod 755 testfile $ls -l testfile -rwxr-xr-x 1 amrood users 1024 Nov 2 00:10 testfile $chmod 743 testfile $ls -l testfile -rwxr---wx 1 amrood users 1024 Nov 2 00:10 testfile $chmod 043 testfile $ls -l testfile ----r---wx 1 amrood users 1024 Nov 2 00:10 testfile
更改全部者和用戶組:
在Linux中,每添加一個新用戶,就會爲它分配一個用戶ID和羣組ID,上面提到的文件權限也是基於用戶和羣組來分配的。
有兩個命令能夠改變文件的全部者或羣組:
· chown :chown 命令是"change owner"的縮寫,用來改變文件的全部者。
· chgrp :chgrp 命令是"change group"的縮寫,用來改變文件所在的羣組。
chown 命令用來更改文件全部者,其語法以下:
$ chown user filelist
user 能夠是用戶名或用戶ID,例如
$ chown amrood testfile
$ 將testfile文件的全部者改成amrood。
注意:超級用戶 root 能夠不受限制的更改文件的全部者和用戶組,可是普通用戶只能更改全部者是本身的文件或目錄。
chgrp 命令用來改變文件所屬羣組,其語法爲:
$ chgrp group filelist
group 能夠是羣組名或羣組ID,例如
$ chgrp special testfile
$ 將文件 testfile 的羣組改成 special。
產生死鎖的緣由主要是:
(1) 由於系統資源不足。
(2) 進程運行推動的順序不合適。
(3) 資源分配不當等。
若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
(3) 不剝奪條件:進程已得到的資源,在未使用完以前,不能強行剝奪。
(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件 ,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不知足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的緣由,尤爲是產生死鎖的四個必要條件,就能夠最大可能地避免、預防和解除死鎖。因此,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何肯定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的狀況下佔用資源。所以,對資源的分配要給予合理的規劃。
不算main這個進程自身,到底建立了多少個進程啊?
int main(int argc, char* argv[]) { fork(); fork() && fork() || fork(); fork(); }
(1) A&&B||C
A爲假,跳過B,判斷C;
A爲真,判斷B,若B爲真,跳過C;
若B爲假,判斷C.
(2) fork()函數父進程返回子進程ID;子進程返回0
第一條語句新增1個;
第二條語句新增4*2個;
第三條語句,此時已有進程1+1+4*2個,因此新增10個.
總數爲2*(2+1+2)*2=20;減去本身就是19.