Linux學習:Linux基礎簡介。

這一節,我們將簡單介紹一下Linux。

1:Linux同windows是一樣的,都是操作系統的一種,都給我們提供一個平臺去開發或者執行某些程序。可以說Linux系統也是軟件的一種,不要將他想的太過於神祕。(
注:通常我們所說的什麼系統都是內核+軟件構成的)

2:接下來我們簡單介紹一下Linux的發展歷史

    Linux是一套自由加開放源代碼的類Unix操作系統,誕生於1991年10月5日(第一次正式向外公佈),由芬蘭學生Linus Torvalds和後來陸續加入的衆多愛好者共同開發完成。
    Linux是一個基於POSIX和Unix的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的Unix工具軟件、應用程序和網絡協議,可支持32位和64位硬件。Linux繼承了Unix以網絡爲核心的設計思想,是一個性能穩定的多用戶網絡操作系統。
    Linux存在着許多不同的版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,比如:手機、平板電腦、路由器、視頻遊戲控制檯、臺式計算機、大型機和超級計算機。
    如果想了解詳細的信息請自己查找一下

3:我們在這裏說一下Linux的系統結構,以便於從大方向瞭解Linux的系統。

    a:之前說了,Linux系統可以作爲一種軟件,提供程序運行的化境,我們將之成爲內核。學過單片機的人都是到,我們最底層是有很簡單的各種小程序構成,例如我們用匯編語言寫一
    些小的程序去控制硬件的某些行爲(也就是高低點平,這裏不做過多介紹)。而我們的Linux系統就是控制我們硬件所有的資源,對這些資源進行同意的分配功能,我們的軟件是能夠
    通過一些調用去使用這些資源。
    b:在Linux中,我們寫一些函數需要調用內核來完成,這裏我們將調用內核完成這中操作叫做系統調用。
    三種方式進行系統調用:shell、   庫函數(全部建立在系統給的接口上)、  直接調用。(如下圖所示)。

4:在這裏我們介紹一下關於登錄Linux進行的操作。

    用戶在登錄的時候需要先後輸入登錄名和登錄的用戶密碼,而這個用戶名和用戶密碼通常是存在/etc/passwd文件下,這個文件每一行都是一個用戶,其中登錄項由7個冒號分隔開來。
    他們分別是登錄名、加密口令、用戶數值ID、用戶數值組ID、註釋字段、其實目錄和用戶使用的SHELL程序。前面我們說shell可以用來和Linux進行交互,因此我們可以配置自己的shell
    程序,這樣更改方便我們的使用。通常默認的shell程序是bash,我喜歡用zsh程序,有關zsh的配置請參考如下連接

5:接下來我們簡單介紹一下文件和目錄

    在Linux中或者unix中可以成爲一切皆文件,因此瞭解Linux中的文件和目錄是十分有必要的。
    在windows中,我們可以將磁盤劃分爲c盤、d盤等。但是在Linux中、我們只有一個磁盤,而這個磁盤是從/(根)目錄開始的,其他的都是以各種方式進行掛載。
    我們這裏說介紹文件和目錄,其實每個目錄可以理解爲包含多個目錄項的文件,如果不信的話可以使用vim dirname去打開一個目錄,你就發下裏面存儲了許多目錄項/文件。
    在Linux中文件中還包含文件的屬性信息,文件屬性有文件大小、文件類型、文件所有者、文件權限、文件的修改時間等。這些屬性我們stat或者fstat進行獲取。
    在這裏我說明一下文件類型(在執行ls -l時候如下圖1就可以區分文件各種信息了,其中文件類型後面九個字符分別是所有者:所屬組:其他人對該文件的讀寫和執行權限):
    文件類型:普通文件(-)、目錄(d)、管道(p)、鏈接文件(l)字符設備文件(c)、 塊設備文件(b)、 套接字(s)。

    文件名:在Linux出現文件名的字符除了/和null,前者用於分割目錄、後者用於結束一個目錄。當然在正常的情況下,儘量只使用印刷字符集,以免引起不必要的麻煩。
    同時我們在創建目錄的時候,會自動創建兩個.和..目錄,這兩個目錄分別代表當前目錄和上一級目錄。
    路徑名:路徑分爲絕對路徑和相對路徑。絕對路徑是從根目錄開始的,例子:/etc/passwd。相對目錄是從當前目錄開始的目錄./../passwd。
    在這裏介紹一下如何得到路徑名:如下面一個小程序就是讀取指定目錄下的所有內容。
    #include <dirent.h>
    #inlcude <stdio.h>

    int main(int argc, char* argv[])
    {
             DIR  *dp;
             struct dirent  *dirp;

             if(argc != 2)
             {
                     return 0;
             }

             if((dp = opendir(argv[1])) == NULL)
             {
                             return 0;
             }
             while((dirp = readdir(dp)) != NULL)
             {
                     printf("%s\n", dirp->d_name);
             }
    }
    關於這個程序只有兩點需要理解兩個其中兩個函數就可以。

    工作目錄:每一個執行的進程都會一個工作目錄。所說的相對路徑都是相對於當前工作目錄而定的。
    起始目錄:也就是當我們登錄到系統是坐在的目錄。

5:接下來介紹一下Linux中有關的輸入和輸出。

    文件描述符,在Linux中當我們打開一個文件的時候,都會返回一個非負的整數,我們讀寫文件都會用到這個非負的整數(注:文件描述符是有限資源)。
    標準輸入和輸出:通常情況下,我們在啓動一個程序的時候會自動打開三個文件描述符,這三個文件描述符分別是標準輸入(從終端讀取數據)、標準輸出(可以將一些信息顯示到終端上)、標準錯誤(將錯誤信息顯示到終端上)。
    帶緩衝去IO和不帶緩衝區IO:帶緩衝區IO和不帶緩衝區IO可以簡單看下圖。不帶緩衝區的IO是直接將進程中的數據輸出到終端設備上。帶緩衝區的IO是將進程中的數據輸出到內核的緩衝
    區中,然後在滿足一定的條件下輸出到終端設備上(這個條件可以是遇到換行符、緩衝區滿、直接輸出(和不帶緩衝區行爲基本一樣))。

    在之後的內容中,我們將詳細介紹緩衝區對讀寫文件的影響。

6:程序和進程:

    程序就是存儲在磁盤上,處於某個目錄中的可執行文件。
    進程就是執行中的程序。

7:出錯處理。

    當Linux中一些函數出錯時,常常會返回一個負值,而且將整形變量error複製爲一個信息,我們可以使用perror/strerror函數將一些錯誤信息返回/打印出來。
    當然,我們相對程序出錯進行一些處理的時候,我們需要包含error.h頭文件。

    實例:
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>

    int main()
    {
            fprintf(stderr, "EACCES  %s\n", strerror(EIO));

            errno = ENOENT;
            perror(NULL);
    }
    其中打印內容如下圖所示

file

當然了,錯誤也是分種類的。可以將錯誤分爲致命性錯誤和非致命性的錯誤。對於非致命性的錯誤、我們可以妥善的處理,對於致命性錯誤、也許只能打印出一條內容之後就退出程序了吧。

8:用戶標識

    前面所說的組ID和用戶ID就是用戶表示,利用這兩個ID將用戶進行劃分。因爲Linux可以說是一切接文件,因此對文件的操作是至關重要的,我們可以利用組ID和用戶ID還有其他人分別賦予
    對應的文件權限,這樣我們就能避免一些文件被誤操作。
    用戶ID:口令文件中標識着用戶ID的數值,用來區分各個不同的登錄用戶。其中有一個特殊的用戶,是root用戶。root用戶有計算機各種權限,並且某些操作系統的功能只有root用戶有,例如
    更改用戶ID/組ID。
    組ID:是爲了方便工作管理的,例如一個組就可以分成一個組ID,那麼在一定程度上、這個組中的成員擁有更多的權限。同時爲了方便看 ls -l命令將ID映射成用戶名,因此、ls-l命令顯示的
    是名字。

    實例:程序獲得用戶ID和組ID。
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    int main()
    {
                printf("uid = %d, gid = %d", getuid(), getgid());

                return 0;
    }
    附加組ID:可以查看/etc/group文件尋找附加組ID,其意思就是用戶不僅可以屬於一個組,還可以屬於其他的組。

9:信號

    信號是通知進程已發生某種情況的一種技術。例如,某一個程序將0作爲除數,那麼將會收到SIGFPE信號。同時、對於接收到的信號,進程有三種處理方式:
    忽略該信號、按照系統默認的方式處理(可以查看(man 7 signal )手冊)、提供一個函數進行處理。關於信號詳情會在後續的章節中提出。

10:時間:

    關於Linux中各種時間對於我們開發程序是十分重要的。例如,我們需要根據當前執行的時間設置隨機種子(srand((unsigned int)time(0))。
    日曆時間:所謂的日曆時間就是1970年1月1日零點整開始到現在精力的秒數,這個時間可以用來記錄文件最近一次改動的記錄。瞭解makefile的會知道makefile會根據
    文件最後修改的時間進行編譯。通常這類時間都是time_t類型存儲的
    進程時間:成爲CPU時間,用以度量進程使用中央處理器的資源。這類時間一般用clock_t類型存儲。
    一個進程有三種時間:時鐘時間(進程運行時間的總量),用戶cpu時間(執行用戶指令所用的時間),系統cpu時間(在內核中執行任務所花費的時間)。

11:系統調用和庫函數

    在最開始就介紹了Linux系統結構,其中就有幾種和內核交互的方式。如shell、庫函數。還介紹了系統調用的概念。
    系統調用:我的理解就是Linux內核提供出各種功能的入口,我們稱爲系統調用,就像open函數似的。
    庫函數:庫函數是在系統調用之上封裝用於提供各種功能的一個庫。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章