apue 第八章 多进程编程

来源:互联网 发布:喵喵淘宝u站 编辑:程序博客网 时间:2024/06/18 07:19
进程: 正在运行的程序! ./a.out


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章



原创粉丝点击