linux系統編程小結

程序和進程的區別

  1. 程序是編好的二進制文件,在磁盤上不佔用內存,cpu等系統資源
    進程是程序運行一次的過程,佔用cpu和內存等系統資源
  2. 一個程序可以有多個進程,但是一個進程只屬於一個程序

併發和並行的區別

併發是在一個cpu上利用時鐘中斷,模擬多個程序同時進行的效果
並行是有多個核,每個核上有不同的線程在運行,是真正的同時運行

fork函數

  1. 頭文件
    <sys/types.h>
    <unistd.h>
  2. 函數原型
    pid_t fork()
    返回值:
    等於0:返回的是子進程
    大於0:返回的是父進程的id
    小於0:函數執行失敗
    注意:如果是想用for循環開多個進程,需要在子進程中break,不然子進程也會執行for中內容

父子進程區別

相同處:子進程會複製父進程的堆,棧,數據段,代碼段,全局變量區,環境變量等(遵循讀時共享,寫時複製)
不同處:進程id,fork返回值,父進程id,進程運行時間,定時器,未決信號集

exec函數族

這裏介紹倆個重點學的,所有的exec函數族都是調用execve的系統函數去完成調用(成功無返回,失敗返回-1)
int execl("./fork",“fork”,NULL):第一個參數規定路徑以及程序名,第一個參數調用的程序名,最後沒有參數就以NULL結尾
int execlp(“ls”,“ls”,"-l",NULL):第一個參數因爲是用的系統環境變量路徑就不用在前面再加路徑,直接寫方法名,後面於第一個方法使用相同

孤兒進程

  1. 產生原因:父進程在子進程前結束,這是孤兒進程會交於系統的init進程管理,並回收相關的資源
  2. 解決辦法:孤兒進程會交由系統進程管理,因此不會產生垃圾,但是爲了防止init進程管理的孤兒進程數量過大可能會崩潰,因此可以最好還是調用wait管理

殭屍進程

  1. 產生原因:父進程在子進程終止時,沒有回收相關資源,在程序結束時系統會回收程序堆棧等資源,但是在內核中的pcb還保留着,以及程序正常退出則保留着程序退出的狀態,如果程序異常終止,則保留着導致進程終止的信號是哪個
  2. 處理方法:
    殺死父進程,他會被交由init進程管理。
    wait方法:阻塞父進程,並清理子進程在內核的存儲,獲取退出狀態
    waitpid:可以設置非阻塞回收
    用進程退出時產生的SIGCHLD信號,對該信號進行處理回收內核資源
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章