相关文章
原理
fork函数用于创建当前进程的子进程,创建子进程时,子进程会复制与父进程一样的堆栈段和数据段,和代码段。
而且fork的返回值,在不同进程中,返回的值不一样,在子进程中,是返回0,而在父进程是返回子进程的PID
进程常用函数
等待函数_____wait(int *status):
1,等待其中一个子进程结束:
①status参数,用于保存子进程结束状态的值
2,发出调用的进制只要有子进程,就会睡眠到子进程中,一个终止为止
3,如果调用成功,则返回子进程的进程ID,如果没有调用成功,则返回-1
等待指定pid的进程结束_____waitpid(pid_t pid,int *status,int options):
①options使用WNOHANG参数,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去
②status参数,用于保存子进程结束状态的值
终止函数_____exit(int status):
1,status为返回退出的状态值,可以用wait获取此值
2,终止本进程
上锁函数_____lockf(fd,mode,size):
1,fd参数为文字描述字
2,mode参数为锁定方式,1为加锁,2为解锁
3,size参数为指定文件的位置,0表示从当前位置到文件尾
内容与过程结果
一、任务1:在main父进程创建两个子进程,两个子进程不编写自己的代码,编译运行查看效果。
int main( )
{
int a=3;
printf(“a=%d”,a);
创建两个子进程
}
过程结果:
二、任务2:在main父进程创建两个子进程, 分别输出两个子进程与父进程的id号。
过程结果:
由运行结果可知,先执行父进程再按内向外,执行子进程2再执行子进程1
三、任务3:在任务2的基础上,在父进程中设置wait函数,等待子进程结束,分别对比与任务3的结果有什么区别,并进行分析。
过程结果:
四、任务4:在main父进程创建两个子进程, 分别在父进程与子进程设置循环输出,查看运行结果,并分析原因
父进程:
for(i=0;i<50;i++){
printf(“Father %d”,i);
}
子进程1:
for(i=0;i<50;i++){
printf(“Son %d”,i);
}
子进程2:
for(i=0;i<50;i++){
printf(“Daughter %d”,i);
}
分别在父进程与子进程设置循环输出,可以看到子进程和父进程发生冲突
五、任务5:在任务4的基础上,使用lockf函数进行资源锁定。
lockf(1,1,0)加锁,lockf(1,0,0)解锁
父进程:
lockf(1,1,0)
for(i=0;i<50;i++){
printf(“Father %d”,i);
}
lockf(1,0,0);
子进程1:
lockf(1,1,0)
for(i=0;i<50;i++){
printf(“Son %d”,i);
}
lockf(1,0,0)
子进程2:
lockf(1,1,0)
for(i=0;i<50;i++){
printf(“Daughter %d”,i);
}
lockf(1,0,0)
六、任务6:在父进程中设置一个死循环,通过Linux的查看进程命令,检查子进程是否变成僵尸进程。
父进程进入死循环,子进程没有执行