進程指正在運行的程序,資源分配的最小單位,可以通過“ps ”或“top”等命令查看正在運行的進程,線程是系統的最小調度單位,一個進程可以擁有多個線程,同一進程里的線程可以共享此進程的同一資源。本章代碼在process/目錄下。 進程類型: 1.交互進程:由shell啟動,用戶和計算機進行問答的進程。 2.批處理進程:不與特定終端相關聯,將任務提交到等待隊列按順序執行的進程。 3.守護進程:后臺運行的特殊進程,用戶不能和它進行會話。 進程的三種狀態: ![]() 1.運行態,正在運行或在運行隊列中等待。 2.可中斷等待態,休眠, 在等待申請的資源有效或等待中斷,信號喚醒。 3.不可中斷等待態,休眠等待資源有效,不能被中斷或信號喚醒。 4.終止態,進程被停止或者被跟蹤狀態,收到SIGCONT信號時,又會恢復運行狀態。 5.僵尸態,進程因某種原因而中止運行,但進程描述符仍存在,不可被Kill。 如果想銷毀某一進程,可在終端輸入“ps -elf”查看進程號,如圖 66.2: ![]() 如果要銷毀qtcreator進程,使用“kill -9 3001”可以銷毀它, ![]() 1進程創建 所有的進程都是由其他進程創建(除了pid為0號的idle進程),pid號為1的init進程是系統啟動后運行的第一個進程,是所有進程的父進程,init進程會初始化一部分系統服務,創建其他進程。 創建新進程的那個進程稱為父進程,新進程稱為子進程,父進程和子進程擁有相同的代碼段數據段,有各自獨立的地址空間。采用寫時拷貝技術,即創建的新進程不會立即把父進程的資源空間復制過來,只有在修改時才會復制資源,另外父進程掛起的信號和文件鎖不會被子進程繼承。 子進程結束后,它的父進程要回收它的資源,否則就會成為僵尸進程 。 如果父進程先結束,子進程會被init進程收養,稱為孤兒進程。 終端輸入“ps -el”查看進程狀態,PID為進程號,PPID為此進程的父進程號,如圖 1.1,1505號進程的父進程為1366進程。 ![]() ![]() getpid():獲取進程PID, ![]() 返回值為PID號。 fork():系統調用,創建一個進程, #include pid_t fork(void); 調用成功父進程返回子進程號,子進程返回0,失敗返回-1。 如以下代碼: for.c: ![]() 打印結果: ![]() 程序執行過程中第一次調用fork()進程2531創建子進程2532;第二次fork(),進程2531創建子進程2533,進程2532創建2534,創建過程如圖 1.3: ![]() ![]() |