makefile
src = $(wildcard ./*.c)
obj = $(patsubst %.c,%,$(src))
all:$(obj)
%:%.c
gcc $< -o $@
clean:
-rm -rf $(obj)
.PHONY: all clean
//make main(main.c文件對應(yīng)的生成可執(zhí)行文件的名字)
//使用系統(tǒng)自帶的makefile文件
程序和進(jìn)程
程序:(劇本)不占用系統(tǒng)資源(總線媚狰,CPU等),只占用磁盤空間
進(jìn)程:(一處完整的戲)運行起來的程序,需要占用系統(tǒng)資源
并發(fā):
分時復(fù)用:
單道程序設(shè)計:串行,所有進(jìn)程一個一個排隊進(jìn)行吮螺。
多道程序設(shè)計(看電影,聽歌,聊天同時進(jìn)行)
時鐘中斷(滴答)到達(dá)的時候规脸,結(jié)束當(dāng)前CPU使用權(quán)坯约,轉(zhuǎn)交給下一個程序。
ps -A 顯示所有程序
ps -u 按用戶名和啟動時間的順序來顯示進(jìn)程莫鸭。
ps -x 顯示所有程序闹丐,不以終端機來區(qū)分,也就是顯示無控制終端的進(jìn)程被因。
ps -j 用任務(wù)格式來顯示進(jìn)程
ps -au | grep mysqld 查看進(jìn)程
關(guān)閉進(jìn)程 kill PID或者kill all
pcb
進(jìn)程控制塊卿拴,結(jié)構(gòu)體
進(jìn)程狀態(tài):(初始態(tài))就緒,運行梨与,掛起堕花,停止
進(jìn)程控制
fork
man 2 fork 創(chuàng)建一個子進(jìn)程
成功:返回兩個參數(shù),PID返回給父進(jìn)程粥鞋,子進(jìn)程返回0缘挽,失敗返回-1.
#include <stdio.h>
#include <unistd.h>
//pid_t fork(void);
int main01(void)
{
printf("before fork1!\n");
printf("before fork2!\n");
printf("before fork3!\n");
pid_t repid = fork();
if(repid == (-1)){
perror("create process fail\n");
exit(1);
}else if(repid == 0){
// printf("child process create\n");
printf("child pid is :%d,****ppid is :%d\n",getpid(),getppid());
}else if(repid > 0){
// printf("parent process create\n");
printf("parent pid is :%d,****ppid is %d\n",getpid(),getppid());
}
// printf("after fork!\n");
return 0;
}
getpid:獲取當(dāng)前進(jìn)程的ID
getppid:父ID
練習(xí)
循環(huán)創(chuàng)建多個子進(jìn)程
int main02(){
printf("before fork1!\n");
printf("before fork2!\n");
printf("before fork3!\n");
int i=0;
for(;i<5;i++){
pid_t repid = fork();
if(repid == 0)
{
break;
}
if(repid == (-1)){
perror("create process fail\n");
exit(1);
}else if(repid == 0){
}else if(repid > 0){
}
}
printf("### %d th ###\n",i+1);
return 0;
}
exec系統(tǒng)調(diào)用
可以把當(dāng)前進(jìn)程替換為一個新進(jìn)程,并轉(zhuǎn)換到調(diào)用進(jìn)程的內(nèi)存空間
注意:沒有返回值
練習(xí)題參考課件呻粹。
孤兒進(jìn)程
父進(jìn)程先于子進(jìn)程結(jié)束壕曼,子進(jìn)程成為孤兒進(jìn)程,子進(jìn)程的父進(jìn)程成為init進(jìn)程等浊。
kill -9 PID kill孤兒進(jìn)程是可以的
僵尸進(jìn)程
進(jìn)程終止腮郊,父進(jìn)程尚未回收,子進(jìn)程殘留的PCB資源存放于內(nèi)核中筹燕,成為了僵尸進(jìn)程轧飞。
不可以Kill僵尸進(jìn)程,可以kill子進(jìn)程撒踪,使之成為孤兒進(jìn)程过咬,在kill掉。