20-進(jìn)程_pstree_kill_fork_execl_waitpid_練習(xí)

進(jìn)程

* 進(jìn)程 程序的一次動態(tài)執(zhí)行過程
進(jìn)程生命周期:
  • 創(chuàng)建:創(chuàng)建虛擬地址空間茴恰、地址空間分段吐限,創(chuàng)建task_struct結(jié)構(gòu)(PCB進(jìn)程控制塊)
  • 調(diào)度:內(nèi)核管理task_struct結(jié)構(gòu)組成的鏈表,根據(jù)優(yōu)先級和進(jìn)程屬性分配時間片
  • 執(zhí)行:進(jìn)程獲得時間片到cpu中執(zhí)行
  • 消亡:進(jìn)程結(jié)束,回收虛擬地址空間,由父進(jìn)程回收task_struct結(jié)構(gòu)杂伟。
虛擬地址空間分段:
  • stack:棧區(qū),存放局部變量仍翰、函數(shù)傳參赫粥、返回地址
  • 不要進(jìn)行太深的遞歸防止棧溢出。
  • heap:堆區(qū)予借,用來給malloc使用的空間
  • 使用完成記得free防止內(nèi)存泄露
  • .bss:未初始化的全局變量/靜態(tài)變量static(作用域)
  • .data:已初始化的全局/靜態(tài)變量
  • .text:代碼越平、常量
* task_struct:pid進(jìn)程號 ppid父進(jìn)程號 用到的資源 內(nèi)存映射表 打開的文件

程序和進(jìn)程有什么區(qū)別 ?

  • 程序是靜態(tài)的灵迫,是一個文件
  • 進(jìn)程是動態(tài)的一個執(zhí)行過程秦叛,包括創(chuàng)建、調(diào)度瀑粥、執(zhí)行挣跋、消亡整個生命周期。
* ps 查看當(dāng)前終端的進(jìn)程 任意的命令也是一個進(jìn)程
  • ps -ef 查看更多進(jìn)程信息狞换,可以查看到父進(jìn)程ID浆劲,tty為?表示與終端無關(guān)哀澈。
  • ps -aux可以查看進(jìn)程狀態(tài)
  • ps -axj可以查看到會話組
  • top可以動態(tài)查看進(jìn)程狀態(tài)包括優(yōu)先級 空格刷新 q退出
* pstree 樹形查看進(jìn)程關(guān)系,init是所有進(jìn)程的根度气,進(jìn)程號為1
* 進(jìn)程組:為了統(tǒng)一管理一些進(jìn)程分的組
* 會話組:比進(jìn)程組更大的單位割按,可以包含多個進(jìn)程組
進(jìn)程分類:
  • 交互進(jìn)程:前臺進(jìn)程(既可以輸入、也可以輸出)磷籍、后臺(只能輸出)

  • 后臺進(jìn)程產(chǎn)生:./a.out &

    • ctrl+z 暫停适荣,bg 放到后臺
    • fg 可以喚到前臺
  • 批處理進(jìn)程

  • 守護進(jìn)程

  • 進(jìn)程狀態(tài):

    S:睡眠/等待態(tài)

    T:停止態(tài)(暫停)

    R:運行態(tài)

    Z:僵尸態(tài),父進(jìn)程沒有回收子進(jìn)程資源

  • +表示前臺 s會話組長 l多線程 <優(yōu)先級比較高 N表示優(yōu)先級比較低

* kill 給進(jìn)程發(fā)送信號 -l可以查看所有的信號 -9強制結(jié)束一個進(jìn)程
* 運行前指定優(yōu)先級 nice ./a.out 10
* 運行時改變優(yōu)先級 renice 5 pid
* 父進(jìn)程退出院领,子進(jìn)程會成為孤兒進(jìn)程弛矛,孤兒進(jìn)程由init接管
* fork();創(chuàng)建一個子進(jìn)程,在父進(jìn)程中返回子進(jìn)程的pid比然,在子進(jìn)程中返回0丈氓。
* fork之前的內(nèi)容拿到結(jié)果(繼承),之后的內(nèi)容原樣復(fù)制。
* fork之前打開的文件万俗,復(fù)制時會延續(xù)之前的結(jié)構(gòu)湾笛,會使用同一個文件指針,父子進(jìn)程操作文件會互相造成影響闰歪。
* getpid獲得自己的pid
* getppid獲得父進(jìn)程的pid
execl :
  • execl(可執(zhí)行文件嚎研,執(zhí)行方式,其他參數(shù)库倘,以NULL結(jié)尾);
  • 替換當(dāng)前地址空間內(nèi)容临扮,執(zhí)行新的可執(zhí)行文件。
  • ...可變長度傳參教翩,以NULL結(jié)尾杆勇。
_exit :
  • _exit(int status);
  • 不清理緩沖區(qū),立即退出當(dāng)前進(jìn)程迂曲。status返回給父進(jìn)程靶橱,父進(jìn)程通過wait一族函數(shù)回收。
* exit() ; 退出進(jìn)程時清理緩沖區(qū)路捧。
* wait() ; 阻塞等待子進(jìn)程改變狀態(tài)关霸,子進(jìn)程改變狀態(tài)之后wait變成非阻塞。
waitpid(pid,status,options);
  • pid: <-1:等待組ID為-pid的子進(jìn)程
  • -1:等待任意子進(jìn)程
  • 0:等待當(dāng)前進(jìn)程組的子進(jìn)程
  • >0:等待指定的子進(jìn)程
  • options:
    • 0:阻塞等待
    • WNOHANG非阻塞杰扫,并且沒有子進(jìn)程退出队寇,直接返回0

練習(xí) :

通過fork創(chuàng)建一個子進(jìn)程,父進(jìn)程復(fù)制1.txt的前一半章姓,子進(jìn)程復(fù)制1.txt的后一半佳遣,然后寫入到2.txt。
/************************************************************************
   > File Name:    homework.c
   > Author:       Lin
   > Mail:         linbb@farsight.cn
   > Created Time: 2016年12月01日 星期四 09時11分48秒
*******************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 64
int main(int argc, const char *argv[])
{
    pid_t p;
    char buf[SIZE];
    int fp1,fp2;
    long len,sum = 0,n;
    fp1 = open("1.txt",O_RDONLY|O_EXCL);
    if(-1 == fp1)
    {
        perror("open1");
        return -1;
    }
    fp2 = open("2.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(-1 == fp2)
    {
        perror("open2");
        return -1;
    }
    len = lseek(fp1,0,SEEK_END);
    if(-1 == len)
    {
        perror("lseek 1");
        return -1;
    }
    len /= 2;
    p = fork();
    if(-1 == p)
    {
        perror("fork");
        return -1;
    }
    if(p == 0)
    {
        if(-1 == lseek(fp1,len,SEEK_SET))
        {
            perror("lseek 2");
            return -1;
        }
        if(-1 == lseek(fp2,len,SEEK_SET))
        {
            perror("lseek 3");
            return -1;
        }

        while(1)
        {
            n = read(fp1,buf,SIZE);
        //  printf("child:n = %ld\n",n);
            if(-1 == n)
            {
                perror("read");
                return -1;
            }
            if(0 == n)
                break;
            write(fp2,buf,n);
        }
    }else
    {
        if(-1 == close(fp1))
        {
            perror("close 1");
            return -1;
        }

        if(-1 == close(fp2))
        {
            perror("close 2");
            return -1;
        }
        fp1 = open("1.txt",O_RDONLY|O_EXCL);
        if(-1 == fp1)
        {
            perror("open1");
            return -1;
        }
        fp2 = open("2.txt",O_WRONLY);
        if(-1 == fp2)
        {
            perror("open2");
            return -1;
        }
        if(-1 == lseek(fp1,0,SEEK_SET))
        {
            perror("lseek 4");
            return -1;
        }
        if(-1 == lseek(fp2,0,SEEK_SET))
        {
            perror("lseek 5");
            return -1;
        }
        while(1)
        {
            n = read(fp1,buf,SIZE);
            sum += n;
        //  printf("father:n = %ld,sum = %ld,len = %ld\n",n,sum,len);
            if(-1 == n)
            {
                perror("read");
                return -1;
            }
            if(sum > len)
            {
                write(fp2,buf,n - (sum - len));
                break;
            }
            write(fp2,buf,n);
        }

    }
    if(-1 == close(fp1))
    {
        perror("close 1");
        return -1;
    }

    if(-1 == close(fp2))
    {
        perror("close 2");
        return -1;
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凡伊,一起剝皮案震驚了整個濱河市零渐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌系忙,老刑警劉巖诵盼,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異银还,居然都是意外死亡风宁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門蛹疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒财,“玉大人,你說我怎么就攤上這事捺弦∫” “怎么了孝扛?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骂际。 經(jīng)常有香客問我疗琉,道長,這世上最難降的妖魔是什么歉铝? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任盈简,我火速辦了婚禮,結(jié)果婚禮上太示,老公的妹妹穿的比我還像新娘柠贤。我一直安慰自己,他們只是感情好类缤,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布臼勉。 她就那樣靜靜地躺著,像睡著了一般餐弱。 火紅的嫁衣襯著肌膚如雪宴霸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天膏蚓,我揣著相機與錄音瓢谢,去河邊找鬼。 笑死驮瞧,一個胖子當(dāng)著我的面吹牛氓扛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播论笔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼采郎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狂魔?” 一聲冷哼從身側(cè)響起蒜埋,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎最楷,沒想到半個月后整份,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡管嬉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朗鸠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚯撩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烛占,靈堂內(nèi)的尸體忽然破棺而出胎挎,到底是詐尸還是另有隱情沟启,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布犹菇,位于F島的核電站德迹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揭芍。R本人自食惡果不足惜胳搞,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望称杨。 院中可真熱鬧肌毅,春花似錦、人聲如沸姑原。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锭汛。三九已至笨奠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唤殴,已是汗流浹背般婆。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留眨八,地道東北人腺兴。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像廉侧,于是被迫代替她去往敵國和親页响。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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