apue 第一章 unix基礎(chǔ)知識

apue 第一章 unix基礎(chǔ)知識


  • unix 體系結(jié)構(gòu)
  1. kernel(內(nèi)核):一種軟件粥庄,控制計算機(jī)的硬件資源狮杨,提供系統(tǒng)的運行環(huán)境
  2. system call(系統(tǒng)調(diào)用):內(nèi)核的接口
  3. 公用函數(shù)庫和shell在系統(tǒng)調(diào)用之上
  4. 應(yīng)用程序構(gòu)建在最外層半沽,既可以使用系統(tǒng)調(diào)用,也就可以使用公用函數(shù)庫和shell

輸入和輸出

文件描述符

  • 通常是一個非負(fù)整數(shù)吴菠,內(nèi)核用來標(biāo)識一個特定的進(jìn)程正在訪問的文件者填,在讀寫文件都會使用文件描述符,open或者create一個文件會返回文件描述符

standard input standard output standard error

  • 但shell允許一個新程序時橄务,默認(rèn)打開三個文件描述符幔托,標(biāo)準(zhǔn)輸入穴亏,標(biāo)準(zhǔn)輸出蜂挪,標(biāo)準(zhǔn)錯誤,不特殊指明都指向終端嗓化,但可以重定向
#標(biāo)準(zhǔn)輸出被重定向到文件
ls > file.list

不帶緩沖的IO

  • 從標(biāo)準(zhǔn)輸入STDIN_FILENO(終端)中讀取數(shù)據(jù)到buf中
  • 從buf中寫東西到標(biāo)準(zhǔn)輸出STDOUT_FILENO(終端)中
  • BUFFZISE一次能讀取的最多字節(jié)
  • 編譯以后執(zhí)行 ./a.out < infile > outfile棠涮,實現(xiàn)文件復(fù)制
#include "apue.h"                                
#define BUFFSIZE    4096
int
main(void)
{
    int n;
    char buf[BUFFSIZE];
    while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");
    if (n < 0)
        err_sys("read error");
    exit(0);
}

標(biāo)準(zhǔn)IO

  • 使用標(biāo)準(zhǔn)io函數(shù)無需選擇緩沖區(qū)大小
  • get一次讀取一個字符,讀完顯示EOF
  • stdin和stdout表示標(biāo)準(zhǔn)輸入和輸出
#include "apue.h"                       
int
main (void)
{
    int c;
    while ((c = getc(stdin)) != EOF)
        if (putc(c, stdout) == EOF)
            err_sys("output error");
    if (ferror(stdin))
        err_sys("input error");
    exit(0);
}

程序和進(jìn)程


  • 程序 program:一個可執(zhí)行文件刺覆,內(nèi)核將程序讀入內(nèi)存严肪,用以執(zhí)行
  • 進(jìn)程 process:程序執(zhí)行的實例,每個進(jìn)程都要一個唯一的 進(jìn)程ID

進(jìn)程控制

  • 啟動程序谦屑,獲取輸入后驳糯,在父進(jìn)程中創(chuàng)建出子進(jìn)程,在子進(jìn)程中執(zhí)行命令
  • 父進(jìn)程等待子進(jìn)程終止
  • fork對子進(jìn)程返回0對父進(jìn)程返回id
#include "apue.h"
#include <sys/wait.h>
int
main(void)
{
    char buf[MAXLINE];
    pid_t pid;
    int status;
    printf("%%");
    while (fgets(buf, MAXLINE, stdin) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0;
        //創(chuàng)建子進(jìn)程
        if ((pid = fork()) < 0)
        {
            err_sys("fork error");
        }   
        //pid = 0 創(chuàng)建子進(jìn)程成功
        else if (pid == 0)
        {
            //執(zhí)行程序
            execlp(buf, buf, (char *)0);
            err_ret("Couldn't execute: %s", buf);
            exit(127);
        }   
        if ((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");
            
        printf("%% ");
    }   
    exit(0);
}

線程thread

  • 一個進(jìn)程內(nèi)的所有線程共享進(jìn)程相關(guān)屬性
  • 進(jìn)程也有id氢橙,但只在進(jìn)程內(nèi)有意義

用戶標(biāo)識

  • 每個用戶一個 用戶id酝枢,不能更改,id為0的為root用戶
  • 組id 允許各個成員之間共享資源
  • 使用username更加方便悍手,在口令文件里包含了這種映射關(guān)系 ls -l可以查看
  • 用戶還有 附屬組id

信號signal


  • 用于通知進(jìn)程系統(tǒng)發(fā)生了某種錯誤系統(tǒng)的處理方式:忽略信號帘睦,系統(tǒng)默認(rèn)處理,捕捉自己處理

  • 系統(tǒng)產(chǎn)生了SIGINT (ctrl+D)信號坦康,會在signal中捕捉到竣付,然后調(diào)用sin_int函數(shù)處理
#include "apue.h"
#include <sys/wait.h>
static void sig_int(int);
int 
main(void)
{
    char buf[MAXLINE];
    pid_t pid;
    int status;

    printf("%%");
    while (fgets(buf, MAXLINE, stdin) != NULL)
    {   
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0;

        if (signal(SIGINT, sig_int) == SIG_ERR)
            err_sys("signal error");

        //創(chuàng)建子進(jìn)程
        if ((pid = fork()) < 0)
        {   
            err_sys("fork error");
        }   
        //pid = 0 創(chuàng)建子進(jìn)程成功
        else if (pid == 0)
        {   
            //執(zhí)行程序
            execlp(buf, buf, (char *)0);
            err_ret("Couldn't execute: %s", buf);
            exit(127);
        }   

        if ((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");

        printf("%% ");
    }   
    exit(0);
}
void sig_int(int signo)
{
    printf("interrupt\n%% ");
}                   
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滞欠,隨后出現(xiàn)的幾起案子古胆,更是在濱河造成了極大的恐慌,老刑警劉巖筛璧,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逸绎,死亡現(xiàn)場離奇詭異,居然都是意外死亡隧哮,警方通過查閱死者的電腦和手機(jī)桶良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮翔,“玉大人陨帆,你說我怎么就攤上這事曲秉。” “怎么了疲牵?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵承二,是天一觀的道長。 經(jīng)常有香客問我纲爸,道長亥鸠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任识啦,我火速辦了婚禮负蚊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颓哮。我一直安慰自己家妆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布冕茅。 她就那樣靜靜地躺著伤极,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姨伤。 梳的紋絲不亂的頭發(fā)上哨坪,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音乍楚,去河邊找鬼当编。 笑死,一個胖子當(dāng)著我的面吹牛炊豪,可吹牛的內(nèi)容都是我干的凌箕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼词渤,長吁一口氣:“原來是場噩夢啊……” “哼牵舱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缺虐,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芜壁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后高氮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慧妄,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年剪芍,在試婚紗的時候發(fā)現(xiàn)自己被綠了塞淹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡罪裹,死狀恐怖饱普,靈堂內(nèi)的尸體忽然破棺而出运挫,到底是詐尸還是另有隱情,我是刑警寧澤套耕,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布谁帕,位于F島的核電站,受9級特大地震影響冯袍,放射性物質(zhì)發(fā)生泄漏匈挖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一康愤、第九天 我趴在偏房一處隱蔽的房頂上張望儡循。 院中可真熱鬧,春花似錦翘瓮、人聲如沸贮折。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踊赠,卻和暖如春呵扛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筐带。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工今穿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伦籍。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓蓝晒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帖鸦。 傳聞我的和親對象是個殘疾皇子芝薇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,161評論 2 33
  • Ubuntu的發(fā)音 Ubuntu攻锰,源于非洲祖魯人和科薩人的語言晾嘶,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,261評論 9 467
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理娶吞,服務(wù)發(fā)現(xiàn)垒迂,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 我們每個人都有微習(xí)慣妒蛇,只不過你不自知机断,例如我們有些人每天早上睜開眼睛就去喝水策添,一起床先去衛(wèi)生間,去衛(wèi)生間必拿手機(jī)毫缆,...
    L_Yao閱讀 171評論 0 0
  • 用真話掩飾事實唯竹,多么嘲諷而又準(zhǔn)確的話語啊。 我常常這樣:面上是玩味的笑容苦丁,說著仿佛不可信而又真實的語言浸颓。 我企圖讓...
    言道_e335閱讀 294評論 0 0