Linux-獲取進程管理

實驗環境
VMware Workstation Pro下Linux Red Hat
內核版本:2.6.32

1.通過vim編寫程序
這裏寫圖片描述
這裏寫圖片描述

首先程序需要包含所需要的頭文件。sys/types.h數據結構pid_t在此構造、sys/wait.h函數wait在內定義、sys/time.h和sys/resource.h包含getpriority函數定義。

其中函數getpriority的函數原型定義如下:int getpriority(int witch, int who);
witch有三個可選項:PRIO_PROCESS、PRIO_PGRP、PRIO_USER分別表示進程、進程組、用戶識別碼。who爲進程的pid號

使用fork()函數內核會返回兩個返回值,若返回值爲0,表示這是子進程;若返回值非零,表示是父進程,並且返回值是子進程的pid號。通過返回值得不同來區分父進程和子進程。

值得一提的是:在子進程的最後可以使用_Exit(0)來終結進程,該函數包含在頭文件unistd.h中,它會調用do_exit()來進行清理工作。具體做了什麼工作呢?

  • 將task_struct標識爲PF_EXITING
  • 調用del_time_sync()刪除內核定時器
  • 調用_exit_mm()放棄mm_struct
  • 調用exit_files(),_exit_fs(),exit_namespace(),exit_sighand()。分別爲文件描述符,文件系統數據,命名空間,信號處理函數。
  • 調用exit_notify()向父進程發信號,併爲子進程尋找新的父親,如果沒有就找init做爲子進程的父親,然後將自己設爲TASK_ZOMBLE(僵死狀態)
  • 最後調用schedule()進行進程調度。(ps.該函數在kernel/exit.c中)

其實除了使用_Exit(0)這種顯式終止以外,系統還可以隱式的終止進程,即在main函數返回的時候去調用do_exit()函數。

另外該程序中還存在除了fork(),exit()之外的另一個系統調用,那就是wait()。它的作用將調用它的進程掛起(文中是將父進程掛起),然後等待其中一個進程退出,並返回該退出進程的pid號。
有興趣的話可以試一下pid = wait(NULL);然後將pid輸出,會發現這個數字和在子程序中調用getpid()獲得的數字是一樣的。

2.運行程序驗證結果
這裏寫圖片描述

程序讓子進程和父進程分別以不同的速度進行數字輸出,可以看出來子進程和父進程是一起執行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章