进程: 正在运行的程序! ./a.out
多进程编程: 实现并发 (多个服务一起执行)
//fork
fork : 创建新的进程! 没有参数!新进程:称之为子进程!
返回值 :
在原进程(父进程): 子进程的ID号,大于0的数!
在新进程(子进程): 等于0的数!
出错: -1
//思考:
1 谁先被执行? 我们无法控制,由操作系统决定!
2 从哪开始执行?
父进程: 继续向下 不是从头开始
子进程: 继续向下 //fork.c printf
3 谁先结束?
bash -- a.out(父进程) -- a.out(子进程)
如果父进程先结束: 子进程成为孤儿进程,会被init进程收养,子进程不会随父进程结束 (比如父进程pinrtf之后 return结束了)
如果子进程先结束,父进程不理睬: 子进程成为僵尸进程 状态 : Z+
父进程时bash的子进程,所以父进程结束后,shell会打印提示!
//wait()
wait(参数); :清理僵尸进程! 实现简单的进程同步!
参数: 子进程退出的返回值!
wait() : 在父进程中调用 以阻塞的方式来等待某一个子进程结束,可以用来控制执行顺序
一个wait只能等某一个子进程
n个子进程则需要n的wait
waitpid(): 等指定的子进程!~~~~~~~~~~~~~
//子进程从父进程继承什么?
集成父进程的代码段,数据段(比如变量)....~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~思考全部自己看书
创建两个进程:
a.out -- a.out
创建三个进程:
a.out -- a.out -- a.out
a.out -- a.out
-- a.out
#include <unistd.h>
int pipe(int pipefd[2]);
//创建N个进程:
//建议:
父进程: 负责创建子进程! 管理子进程!
子进程: 做事情
算大质数(素数)
1 使用单进程
2 使用多进程
3000~3200
单:
real 0m0.002s
user 0m0.000s
sys 0m0.001s
多:
real 0m0.020s
user 0m0.000s
sys 0m0.015s
300000000~300000200
1,使用单进程!
2,使用多进程!每一个进程负责计算一个数!
3,创建4个子进程,来计算大质数!
p1: 3000~3050 0
for(i = (0)*L/4+L; i< (0+1)*L/4+L; i++)
p2: 3051~3100
for(i = (1)+L)
p3:
p4:
10~20 11个数 3进程 (20-10)/3==3
p1: 10 11 12 for(i=(0)*3+10;i<1*3+10)
p2: 13 14 15 for(i=1*3+10;i<2*3+10)
p3: 16 17 18 for(i=2*3+10;i<3*3+10)
10~20 11个数 3进程
p1: 10 13 16 19
p2: 11 14 17 20
p3: 12 15 18 21
分析 :程序效率
小数据:单进程!
大数据:多进程!
fork:负责创建进程!
wait:等待/清理进程!
//创建进程后:做什么?
1 子进程中:调用自己的函数! 实现自己的功能
2 子进程中:执行现有的程序!
在子进程中执行 ls -l
//exec fork创建子进程后,子进程往往要调用exec函数执行另一个程序!
exec 6种形式:
如果在进程中调用exec函数:
成功: 当前进程的代码段会被新的程序代码段覆盖,从新程序的main函数开始执行!
失败: 向下执行
//execl (命令路径,命令名称,命令的参数...,NULL):
例如:
execl("/bin/ls","ls","-l",NULL)
//execv(命令路径,指针数组) 指针数组 包含这些内容: "ls","-l",NULL
例如:
char *cmd[3] = {"ls","-l",NULL};
execv("/bin/ls",cmd)
//execlp(命令名称,命令名称,命令参数..., NULL) :p自己查找
execlp("ls","ls","-l",NULL)
//execvp(命令名称,指针数组)
execvp("ls",cmd)
//execle:自己传递指定的环境变量
//execve
练习:
创建两个进程:进程1执行ls -l ,进程2执行ps命令!
要求: ps命令先执行
练习(作业):编写实现myshell程序!
功能:
1,myshell#ls
2,myshell#ls -l
3,myshell#ls -l -a -i
4,myshell#ls -l -a
5,myshell# ls -l -a
6,myshell#ls -l > abc , ls结果存到abc中,清空写,cat abc 查看内容
7,myshell#ls -l >> abc ,ls结果追加写到abc中
8,myshell#exit/cd等命令 exit/cd 不是单独的命令
9,myshell#ls -l | more
提示:可以执行任意命令!
shell : 命令解释器!
//结束/管理进程:
kill -9 pid 结束指定pid的某一个进程
killall [-9] cmd_name结束所有跟cmd_name名字相同的进程!
进程: 前台 后台
ctrl+z : 将前台程序挂起到后台,使处于暂停状态!
查看挂起的进程: jobs
将挂起的进程恢复到前台继续执行: fg
特殊进程:
//守护进程: 类似windows的服务! 见9+13章
a.out不是进程,只是可执行文件
多进程编程: 实现并发 (多个服务一起执行)
//fork
fork : 创建新的进程! 没有参数!新进程:称之为子进程!
返回值 :
在原进程(父进程): 子进程的ID号,大于0的数!
在新进程(子进程): 等于0的数!
出错: -1
//思考:
1 谁先被执行? 我们无法控制,由操作系统决定!
2 从哪开始执行?
父进程: 继续向下 不是从头开始
子进程: 继续向下 //fork.c printf
3 谁先结束?
bash -- a.out(父进程) -- a.out(子进程)
如果父进程先结束: 子进程成为孤儿进程,会被init进程收养,子进程不会随父进程结束 (比如父进程pinrtf之后 return结束了)
如果子进程先结束,父进程不理睬: 子进程成为僵尸进程 状态 : Z+
父进程时bash的子进程,所以父进程结束后,shell会打印提示!
//wait()
wait(参数); :清理僵尸进程! 实现简单的进程同步!
参数: 子进程退出的返回值!
wait() : 在父进程中调用 以阻塞的方式来等待某一个子进程结束,可以用来控制执行顺序
一个wait只能等某一个子进程
n个子进程则需要n的wait
waitpid(): 等指定的子进程!~~~~~~~~~~~~~
//子进程从父进程继承什么?
集成父进程的代码段,数据段(比如变量)....~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~思考全部自己看书
创建两个进程:
a.out -- a.out
创建三个进程:
a.out -- a.out -- a.out
a.out -- a.out
-- a.out
#include <unistd.h>
int pipe(int pipefd[2]);
//创建N个进程:
//建议:
父进程: 负责创建子进程! 管理子进程!
子进程: 做事情
算大质数(素数)
1 使用单进程
2 使用多进程
3000~3200
单:
real 0m0.002s
user 0m0.000s
sys 0m0.001s
多:
real 0m0.020s
user 0m0.000s
sys 0m0.015s
300000000~300000200
1,使用单进程!
2,使用多进程!每一个进程负责计算一个数!
3,创建4个子进程,来计算大质数!
p1: 3000~3050 0
for(i = (0)*L/4+L; i< (0+1)*L/4+L; i++)
p2: 3051~3100
for(i = (1)+L)
p3:
p4:
10~20 11个数 3进程 (20-10)/3==3
p1: 10 11 12 for(i=(0)*3+10;i<1*3+10)
p2: 13 14 15 for(i=1*3+10;i<2*3+10)
p3: 16 17 18 for(i=2*3+10;i<3*3+10)
10~20 11个数 3进程
p1: 10 13 16 19
p2: 11 14 17 20
p3: 12 15 18 21
分析 :程序效率
小数据:单进程!
大数据:多进程!
fork:负责创建进程!
wait:等待/清理进程!
//创建进程后:做什么?
1 子进程中:调用自己的函数! 实现自己的功能
2 子进程中:执行现有的程序!
在子进程中执行 ls -l
//exec fork创建子进程后,子进程往往要调用exec函数执行另一个程序!
exec 6种形式:
如果在进程中调用exec函数:
成功: 当前进程的代码段会被新的程序代码段覆盖,从新程序的main函数开始执行!
失败: 向下执行
//execl (命令路径,命令名称,命令的参数...,NULL):
例如:
execl("/bin/ls","ls","-l",NULL)
//execv(命令路径,指针数组) 指针数组 包含这些内容: "ls","-l",NULL
例如:
char *cmd[3] = {"ls","-l",NULL};
execv("/bin/ls",cmd)
//execlp(命令名称,命令名称,命令参数..., NULL) :p自己查找
execlp("ls","ls","-l",NULL)
//execvp(命令名称,指针数组)
execvp("ls",cmd)
//execle:自己传递指定的环境变量
//execve
练习:
创建两个进程:进程1执行ls -l ,进程2执行ps命令!
要求: ps命令先执行
练习(作业):编写实现myshell程序!
功能:
1,myshell#ls
2,myshell#ls -l
3,myshell#ls -l -a -i
4,myshell#ls -l -a
5,myshell# ls -l -a
6,myshell#ls -l > abc , ls结果存到abc中,清空写,cat abc 查看内容
7,myshell#ls -l >> abc ,ls结果追加写到abc中
8,myshell#exit/cd等命令 exit/cd 不是单独的命令
9,myshell#ls -l | more
提示:可以执行任意命令!
shell : 命令解释器!
查看进程: ps
ps -aux
pstree [-p]
//结束/管理进程:
kill -9 pid 结束指定pid的某一个进程
killall [-9] cmd_name结束所有跟cmd_name名字相同的进程!
进程: 前台 后台
ctrl+z : 将前台程序挂起到后台,使处于暂停状态!
查看挂起的进程: jobs
将挂起的进程恢复到前台继续执行: fg
特殊进程:
//守护进程: 类似windows的服务! 见9+13章