makefile
src = $(wildcard ./*.c)
obj = $(patsubst %.c,%,$(src))
all:$(obj)
%:%.c
gcc $< -o $@
clean:
-rm -rf $(obj)
.PHONY: all clean
//make main(main.c文件对应的生成可执行文件的名字)
//使用系统自带的makefile文件
程序和进程
程序:(剧本)不占用系统资源(总线,CPU等),只占用磁盘空间
进程:(一处完整的戏)运行起来的程序,需要占用系统资源
并发:
分时复用:
单道程序设计:串行,所有进程一个一个排队进行。
多道程序设计(看电影,听歌,聊天同时进行)
时钟中断(滴答)到达的时候,结束当前CPU使用权,转交给下一个程序。
ps -A 显示所有程序
ps -u 按用户名和启动时间的顺序来显示进程。
ps -x 显示所有程序,不以终端机来区分,也就是显示无控制终端的进程。
ps -j 用任务格式来显示进程
ps -au | grep mysqld 查看进程
关闭进程 kill PID或者kill all
pcb
进程控制块,结构体
进程状态:(初始态)就绪,运行,挂起,停止
进程控制
fork
man 2 fork 创建一个子进程
成功:返回两个参数,PID返回给父进程,子进程返回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:获取当前进程的ID
getppid:父ID
练习
循环创建多个子进程
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系统调用
可以把当前进程替换为一个新进程,并转换到调用进程的内存空间
注意:没有返回值
练习题参考课件。
孤儿进程
父进程先于子进程结束,子进程成为孤儿进程,子进程的父进程成为init进程。
kill -9 PID kill孤儿进程是可以的
僵尸进程
进程终止,父进程尚未回收,子进程残留的PCB资源存放于内核中,成为了僵尸进程。
不可以Kill僵尸进程,可以kill子进程,使之成为孤儿进程,在kill掉。