2017-2018-1 20155213 《信息安全系統設計基礎》第六週學習總結

2017-2018-1 20155213 《信息安全系統設計基礎》第六週學習總結

教材學習內容總結

瀏覽了正章,重點學習瞭如下幾個點

前些時候寫過基於fork(),execvp()和wait()實現類linux下的bash——mybash,裏面有着我關於fork(),execvp()和wait()的一點看法。

教材學習中的問題和解決過程

  • 問題1:怎麼作到fork函數返回兩次,而且兩次不一樣(一次爲子進程的pid,一次爲0)?
  • 問題1的解決:每個進程都有屬於本身的pcb來存儲關於本進程的相關數據,而PCB在是以結構體形態存在於內存中的,在調用fork函數的時候,系統會複製一份PCB給子進程(copy_thread),裏面保存了相關寄存器的內容——pt_regs,這時修改pt_regs裏面的ax寄存器內容使之爲0,這樣當返回至用戶態時就保證了返回值爲0;
  • 問題2:怎麼對於僵死子進程,此時父進程已終止,子進程由誰回收,且父進程的父進程是誰,是其子進程的「爺爺」進程嗎,回收父進程的是誰,是「爺爺」進程仍是init進程?html

  • 問題2解決:沒有找到相關的介紹,因此就簡單作了個實驗來解釋,首先假設回收該進程的都是其父進程,被回收的都是子進程,這樣就能夠經過使用getppid()函數來獲得回收進程的pid號,下面是幾個測試代碼:
  • 測試1:測試父進程等待子進程並回收其java

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int i=0;
    pid_t pid;
    printf("p_pid=%d\n",getppid());
    pid=fork();
    wait(NULL);
    if(pid==0){
    //sleep(10);
    printf("cp_pid=%d\n",getppid());
    }
    printf("this pid is %d\n",getpid());
    exit(1);
}

  • 運行截圖:
  • 測試2:測試父進程已終止,子進程此時的父進程pid號是多少,即回收該子進程的進程是多少
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int i=0;
    pid_t pid;
    printf("p_pid=%d\n",getppid());
    pid=fork();
    //wait(NULL);
    if(pid==0){
    sleep(10);
    printf("cp_pid=%d\n",getppid());
    }
    printf("this pid is %d\n",getpid());
    exit(1);
}
  • 運行截圖:
    linux

  • 經過以上實驗,能夠看出,父進程調用fork函數生成的子進程的ID號恰好比其多一(父進程ID:50367,子進程ID:50368),再者,當父進程等待並回收子進程時,子進程顯示的父進程ID號恰好等於50367,這就符合了以上假設,但有個問題,此時的父進程的父進程ID號是50171,並不是書上所寫的init祖先進程的ID號(init ID號爲1),這是一個問題;以上是根據測試1獲得的結論;
  • 測試2獲得的結論是,當產生本身的父進程終止後,回收本身的老是ID號爲1503的進程,也不符合書上回收殭屍進程的爲init進程
  • 如今就有兩種可能,第一種,書上說錯了,但問題出現了,爲何回收子進程的是ID號爲1503的進程,而回收父進程的是ID號爲50171的進程,若是說ID號爲1503的進程是做爲回收進程的專有進程,那爲何會有差別,但這樣也有解釋就是回收殭屍進程和正常回收進程是不同的進程作的事;第二種可能就是假設錯了,不能簡單的經過getppid()這個函數就判斷回收該進程的是誰,若是是這樣,那麼就簡單的按照書上所給前提下個結論:正常回收子進程的都是其父進程,而回收父進程的都是init(祖先)進程,對於殭屍進程都由init代爲回收,同時獲得另外一個結論,不能簡單實用getppid()函數獲得回收進程的進程的ID號;
  • 翻看到第八章後面發現了幾個bash指令,其中之一就是ps指令(用於打印出當前系統中的進程(包括殭屍進程));經過ps aux|grep 1503ps aux|grep 50171獲得以下圖,其中每行的最後一個字段表明command,即執行者是誰,這樣就順藤摸瓜獲得了./Fork的父進程是ID號爲50171的由bash執行的進程,因此理所應當在父進程終止後有由bash回收,而對於ID號爲1503的進程的執行者是/sbin/upstart,這裏的/sbin/upstart就是在書中提到的專門回收進程的「init」進程,但並非全部進程的祖先,這裏仍是回到ps指令獲得的信息來看,這裏是存在者名爲init的祖先進程的,即ID號爲1的進程,但此時的這個祖先進程不在執行全部的僵死進程的回收了,而將此功能賦予給了/sbin/upstart創造出來的ID號爲1503的進程,由她來收集僵死進程。git


代碼調試中的問題和解決過程

  • 問題1:statistics運行時,總會出現xargs cat:因信號13而終止的錯誤,我嘗試把.c改爲.java,就沒有那樣的錯誤了,我百度但沒有關於信號13的解釋,我決定重讀statistics腳本;
    安全

  • 問題1的解決:bash

語句 含義
find . -name "*.c" 找到當前目錄下全部.c文件
xargs cat 這裏的xargs至關於一個鏈接管道,將find找到的文件輸送到cat指令下,並執行
grep -v $ grep -v指的是捕捉非-v後面的其餘內容,$指的是空行
wc -l 統計文檔裏的行數
  • 解釋了以後就清晰多了,但依然沒有找到錯誤何在,若是不是腳本里面的錯,那就是捕捉到的文件的問題,我從新用find . -name "*.c"檢索了一遍全部.c文件,發現有個命名是這樣的mybash (復件).c文件名存在一個空格,刪除該文件後以及其餘文件名有空格的文件後,從新運行statistics腳本,結果就正常了。


代碼託管

結對及互評

結對隊友20155303函數

其餘(感悟、思考等,可選)

這周有點感慨,就是linux其實提供了不少指令供咱們學習linux,與其只是去簡單的在C語言上作表面功夫,不如深刻學習一下linux裏的bash指令,每每會有事半功倍的效果。學習

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 15篇 400小時
第一週 177/177 1/1 10/10
第三週 308/485 2/2 12/22
第五週 277/762 2/4 10/32
第六週 567/1329 1/5 15/47

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。測試

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法ui

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進狀況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索