1.Linux關機重啟命令:
在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,此選項為缺省選項
reboot的工作過程與halt類似,其作用是重新啟動,而halt是關機。其參數也與halt類似。reboot命令重啟動系統時是刪除所有的進程,而不是平穩地終止它們。因此,使用reboot命令可以快速地關閉系統,但如果還有其它用戶在該系統上工作時,就會引起數據的丟失。所以使用reboot命令的場合主要是在單用戶模式。
init是所有進程的祖先,其進程號始終為1。init用於切換系統的運行級別,切換的工作是立即完成的。init 0命令用於立即將系統運行級別切換為0,即關機;init 6命令用於將系統運行級別切換為6,即重新啟動。
2.進程對應的內存空間中所包含的5種不同的數據區:
代碼段:代碼段是用來存放可執行文件的操作指令,也就是說是它是可執行程序在內存中的鏡像。代碼段需要防止在運行時被非法修改,所以只准許讀取操作,而不允許寫入(修改)操作—它是不可寫的。
數據段:數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。
BSS段:BSS段包含了程序中未初始化的全局變量,在內存中bss段全部置零。
堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)。
棧:棧是用戶存放程序臨時創建的局部變量,也就是說我們函數括弧“{}”中定義的變量(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且待到調用結束后,函數的返回值也會被存放回棧中。由於棧的先進后出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。
3.Linux文件權限:
為了更加安全的存儲文件,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
也可以同時使用多個符號:
$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命令更改權限:
$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。
4.死鎖:
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件 ,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久占據系統資源。此外,也要防止進程在處於等待狀態的情況下占用資源。因此,對資源的分配要給予合理的規划。
5.fork()函數:
不算main這個進程自身,到底創建了多少個進程啊?
int main(int argc, char* argv[]) { fork(); fork() && fork() || fork(); fork(); }
