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