20-進程_pstree_kill_fork_execl_waitpid_練習

進程

* 進程 程序的一次動態執行過程
進程生命周期:
  • 創建:創建虛擬地址空間、地址空間分段,創建task_struct結構(PCB進程控制塊)
  • 調度:內核管理task_struct結構組成的鏈表,根據優先級和進程屬性分配時間片
  • 執行:進程獲得時間片到cpu中執行
  • 消亡:進程結束,回收虛擬地址空間,由父進程回收task_struct結構。
虛擬地址空間分段:
  • stack:棧區,存放局部變量、函數傳參、返回地址
  • 不要進行太深的遞歸防止棧溢出。
  • heap:堆區,用來給malloc使用的空間
  • 使用完成記得free防止內存泄露
  • .bss:未初始化的全局變量/靜態變量static(作用域)
  • .data:已初始化的全局/靜態變量
  • .text:代碼、常量
* task_struct:pid進程號 ppid父進程號 用到的資源 內存映射表 打開的文件

程序和進程有什么區別 ?

  • 程序是靜態的,是一個文件
  • 進程是動態的一個執行過程,包括創建、調度、執行、消亡整個生命周期。
* ps 查看當前終端的進程 任意的命令也是一個進程
  • ps -ef 查看更多進程信息,可以查看到父進程ID,tty為?表示與終端無關。
  • ps -aux可以查看進程狀態
  • ps -axj可以查看到會話組
  • top可以動態查看進程狀態包括優先級 空格刷新 q退出
* pstree 樹形查看進程關系,init是所有進程的根,進程號為1
* 進程組:為了統一管理一些進程分的組
* 會話組:比進程組更大的單位,可以包含多個進程組
進程分類:
  • 交互進程:前臺進程(既可以輸入、也可以輸出)、后臺(只能輸出)

  • 后臺進程產生:./a.out &

    • ctrl+z 暫停,bg 放到后臺
    • fg 可以喚到前臺
  • 批處理進程

  • 守護進程

  • 進程狀態:

    S:睡眠/等待態

    T:停止態(暫停)

    R:運行態

    Z:僵尸態,父進程沒有回收子進程資源

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

* kill 給進程發送信號 -l可以查看所有的信號 -9強制結束一個進程
* 運行前指定優先級 nice ./a.out 10
* 運行時改變優先級 renice 5 pid
* 父進程退出,子進程會成為孤兒進程,孤兒進程由init接管
* fork();創建一個子進程,在父進程中返回子進程的pid,在子進程中返回0。
* fork之前的內容拿到結果(繼承),之后的內容原樣復制。
* fork之前打開的文件,復制時會延續之前的結構,會使用同一個文件指針,父子進程操作文件會互相造成影響。
* getpid獲得自己的pid
* getppid獲得父進程的pid
execl :
  • execl(可執行文件,執行方式,其他參數,以NULL結尾);
  • 替換當前地址空間內容,執行新的可執行文件。
  • ...可變長度傳參,以NULL結尾。
_exit :
  • _exit(int status);
  • 不清理緩沖區,立即退出當前進程。status返回給父進程,父進程通過wait一族函數回收。
* exit() ; 退出進程時清理緩沖區。
* wait() ; 阻塞等待子進程改變狀態,子進程改變狀態之后wait變成非阻塞。
waitpid(pid,status,options);
  • pid: <-1:等待組ID為-pid的子進程
  • -1:等待任意子進程
  • 0:等待當前進程組的子進程
  • >0:等待指定的子進程
  • options:
    • 0:阻塞等待
    • WNOHANG非阻塞,并且沒有子進程退出,直接返回0

練習 :

通過fork創建一個子進程,父進程復制1.txt的前一半,子進程復制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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容