实验 进程理
1.实验目:
(1)加深进程概念理解明确进程程序区
(2)进步认识发执行实质
(3)分析进程争资源现象学解决进程互斥方法
(4)解Linux系统中进程通信基原理
2.实验预备容
(1)阅读Linuxschedh源码文件加深进程理概念理解
(2)阅读Linuxfork()源码文件分析进程创建程
3.实验容
(1)进程创建:
编写段程序系统调fork() 创建两子进程程序运行时系统中父进程两子进程活动进程屏幕显示字符:父进程显示字符a子进程分显示字符bc试观察记录屏幕显示结果分析原
源代码:
#include
#include
#include
#include
#include
int main(int argcchar* argv[])
{
pid_t pid1pid2
pid1 fork()
if(pid1<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid1 0){
printf(b\n)
}
else{
pid2 fork()
if(pid2<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid2 0){
printf(c\n)
}
else{
printf(a\n)
sleep(2)
exit(0)
}
}
return 0
}
结果:
分析原:
pidfork()
操作系统创建新进程(子进程) 进程表中相应建立新表项新进程原进程执行程序程序文数绝部分 原进程(父进程)拷贝两相互独立进程三进程先执行执行完全取决操作系统调度没固定序
(2)进程控制
修改已编写程序进程输出字符改进程输出句话观察程序执行时屏幕出现现象分析原
父进程输出改father process completed
输出b子进程改输出child process1 completed
输出c子进程改输出child process2 completed
运行结果:
理(1)
果程序中系统调lockf () 进程加锁实现进程间互斥观察分析出现现象
加锁代码:
#include
#include
#include
#include
#include
int main(int argcchar* argv[])
{
pid_t pid1pid2
pid1 fork()
if(pid1<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid1 0){
lockf(110)
printf(child process1 completed\n)
}
else{
pid2 fork()
if(pid2<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid2 0){
lockf(110)
printf(child process2 completed\n)
}
else{
lockf(110)
printf(father process is completed\n)
sleep(2)
exit(0)
}
}
return 0
}
谓进程互斥指两两进程时进入关组享变量界区域否发生时间关错误种现象称作进程互斥lockf()函数文件区域作信号量(监视锁)控制锁定进程访问(强制模式记录锁定)试图访问已锁定资源进程返回错误进入休态直资源解锁定止面三进程存时进入组享变量界区域现象输出原相
(3)
a) 编写段程序实现进程软中断通信
求:系统调fork() 创建两子进程系统调signal() 父进程捕捉键盘中断信号(DEL键)捕捉中断信号父进程系统调Kill() 两子进程发出信号子进程捕捉信号分输出列信息终止:
Child Process 1 is killed by Parent
Child Process 2 is killed by Parent
父进程等两子进程终止输出信息终止:
Parent Process is killed
代码:
#include
#include
#include
#include
#include
#include
int wf
void waiting()
{
while(wf0)
}
void stop()
{
wf 0
}
int main(int argcchar* argv[])
{
pid_t pid1pid2
pid1 fork()
if(pid1<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid1 0){
wf 1
signal(16stop)捕捉父进程传16信号继续执行
waiting()执行
lockf(110)
printf(Child Process 1 is killed by Parent\n)
lockf(100)
exit(0)
}
else{
pid2 fork()
if(pid2<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid2 0){
wf 1
signal(17stop)
捕捉父进程传17信号继续执行
waiting()执行
lockf(110)
printf(Child Process 2 is killed by Parent\n)
lockf(100)
exit(0)
}
else{
wf 1
wf1时执行直捕捉键盘传信号
signal(SIGINTstop)
捕捉键盘传信号执行stop函数
waiting()
kill(pid116)子进程p1发软中断信号16
kill(pid217)
子进程p2发软中断信号17
wait(0)
wait(0)
printf(Parent Process is killed\n)
exit(0)
}
}
return 0
ctrl+c运行结果:
软中断般指指令int引起伪中断动作——CPU制造中断假象硬中断实实8259连线触发中断kill函数原型:int kill(pidsig)pid 组进程标识符参数sig发送软中断信号signal函数原型:signal(sigfunction) 软中断信号序号作参数调函数说收软中断信号sig调函数function子进程1收软中断信号16时调函数stop()解waiting继续执行等印完child process 1 is killed by parent退出子进程2说父进程阶段直处waiting状态(执行wait(0))直两子进程退出父进程会退出
ctrl+c信号会发传进程中进程受该信号会立刻终止子进程收ctrl+c信号时终止根会等父进程传软中断信号会印出child process1 is killedchild process2 is killed
b) 面程序中增加语句signal(SIGINT SIGIGN) signal(SIGQUIT SIGIGN)观察执行结果分析原
ctrl+c运行结果:
signal(SIGINT SIGIGN)signal(SIGQUIT SIGIGN)作屏蔽键盘传中断信号子进程接收父进程传软中断信号进两句话印出
(4)进程道通信
编制段程序实现进程道通信
系统调pipe() 建立条道线两子进程P1P2分道写句话:
Child 1 is sending a message
Child 2 is sending a message
父进程道中读出两子进程信息显示屏幕
求父进程先接收子进程P1发消息然接收子进程P2发消息
源代码:
#include
#include
#include
#include
#include
int main(int argcchar* argv[])
{
pid_t pid1pid2
int fd[2]
char parbuf[50]childbuf[50]
pipe(fd)建立道
pid1 fork()
if(pid1<0){
fprintf(stderrchildprocess2 failed)
exit(1)
}
else if(pid1 0){
lockf(fd[1]10)
sprintf(childbufChild 2 is sending a message\n)
write(fd[1]childbuf50)道中写东西
sleep(5)
lockf(fd[1]00)
exit(0)
}
else{
pid2 fork()
if(pid2<0){
fprintf(stderrchildprocess1 failed)
exit(1)
}
else if(pid2 0){
lockf(fd[1]10)
sprintf(childbufChild 1 is sending a message\n)
write(fd[1]childbuf50)道中写东西
sleep(5)
lockf(fd[1]00)
exit(0)
}
else{
wait(0)等某子进程结束
read(fd[0]parbuf50)道中读东西
printf(sparbuf)
wait(0)等某子进程结束read(fd[0]parbuf50)道中读东西printf(sparbuf)
exit(0)
}
}
return 0
}
运行结果:
值注意pipe(fd)pid1 fork()两句位置调换否会出现面结果:
说子进程1通道父进程发送信息程序直退出strace命令追查发现
果先forkfork两独立进程两独立进程中分调pipe两独立fd数组子进程fd[1]写 入父进程fd[0]读取父进程会堵read根没进程写父进程fd[1]
4.思考
(1)系统样创建流程?
系统通调fork函数创建进程进程调fork系统会创建子进程子进程父进程方进程ID父 进程ID样象符进程 克隆(clone)样时子进程父进程分道扬镳执行操作先执行子进程先执行父进程取决核调度算法 旦子进程创建父子进程相互竞争系统资源时候希子进程继续执行父进程阻塞直子进程完成务时候调wait者 waitpid系统调
(2)执行文件加载时进行处理?
注册执行文件加载模块(包含信息:链表list属module加载执行文件加载享库)然遍历链表次module加载执行文件
(3)首次调新创建进程时入口里?
进程队列ready状态离父进程执行调度入口父进程处
(4)进程通信什特点?
(针道通信)
支持单数流
具亲缘关系进程间
没名字
道缓区 限(道制存存中道创建时缓区分配页面)
道传送格式字节流求道读出方写入方 必须事先约定数格式少字节算作消息(命令记录)等等
总结
通次实验操作系统进程章容更深入理解次实验四部分组成第部分重点进程创建linx操作系统中进程创建需调fork函数函数调次返回两次第二部分重点进程互斥谓进程互斥指两两进程时进入关组享变量界区域通编程更加理解概念进程互斥通lockf()实现第三部分重点通kill()函数signal()函数深入理解进程间软中断前者发送软中断信号者接收软中断信号第四部分重点通pipe()函数理解进程间道通信
次实验学调试方法中strace追查程序中函数调道通信中fork()pipe()函数序意调换调换引起问题(程序直退出)strace命令追查发现父进程blockread()面父进程知道里读取信息进通查阅资料知fork()pipe()函数序问题
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档