操作系统实验--进程的创建撤销和控制
进程的创建撤销和控制
一、实验名称
进程的创建撤销和控制
二、实验内容
学生独立设计用于描述进程的数据结构,完成进程的创建、同步和互斥。
三、实验原理和设计思路
在Linux系统下用fork()函数创建进程,lockf()函数对进程加锁,实现进程的创建撤销与控制。
四、源代码
1.进程的创建
#include<stdio.h>
main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
putchar('b');
else
{
while((p2=fork())==-1);
if(p2==0)
putchar('c');
else
putchar('a');
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.进程的控制
#include<stdio.h>
main()
{
int p1,p2,i;
while((p1=fork())==-1);
if(p1==0)
for(i=0;i<50;i++)
printf("child %d\n",i);
else
{
while((p2=fork())==-1);
if(p2==0)
for(i=0;i<50;i++)
printf("son %d\n",i);
else
for(i=0;i<50;i++)
printf("daughter %d\n",i);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
3.进程的控制2
#include<stdio.h>
#include<unistd.h>
main()
{
int p1,p2,i;
while((p1=fork())==-1);
if(p1==0)
{
lockf(1,1,0);
for(i=0;i<50;i++)
printf("child %d\n",i);
lockf(1,0,0);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
lockf(1,1,0);
for(i=0;i<50;i++)
printf("son %d\n",i);
lockf(1,0,0);
}
else
{
lockf(1,1,0);
for(i=0;i<50;i++)
printf("daughter %d\n",i);
lockf(1,0,0);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
4.软中断通信
#include<unistd.h>
#include<stdio.h>
#include<signal.h>
void waiting(),stop();
int wait_mark;
main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1>0)
{
while((p2=fork())==-1);
if(p2>0)
{
printf("parent \n");
wait_mark=1;
signal(SIGINT,stop);
waiting(0);
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("parent process is killed! \n" );
exit(0);
}
else
{
printf("p2 \n");
wait_mark=1;
signal(17,stop);
waiting();
lockf(stdout,1,0);
printf("child process 2 is killed by parent! \n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
printf("p1\n");
wait_mark=1;
signal(16,stop);
waiting();
lockf(stdout,1,0);
printf("chile process 1 is killed by parent! \n");
lockf(stdout,0,0);
exit(0);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
5.软中断通信2
#include<unistd.h>
#include<stdio.h>
#include<signal.h>
int pid1,pid2;
int EndFlag=0,pf1,pf2=0;
void IntDelete()
{
kill(pid1,16);
kill(pid2,17);
EndFlag=1;
}
void Int1()
{
printf("child process 1 is killed by parent!");
exit(0);
}
void Int2()
{
printf("child process 2 is killed by parent!");
exit(0);
}
main()
{
int exitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
{
printf("p1\n");
signal(SIGUSR1,Int1);
signal(16,SIG_IGN);
pause();
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
printf("p2\n");
signal(SIGUSR2,Int2);
signal(17,SIG_IGN);
pause();
exit(0);
}
else
{
printf("parent\n");
signal(SIGINT,IntDelete);
waitpid(-1,&exitpid,0);
printf("parent process is killed!\n");
exit(0);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
五、结果截图
图 1 进程的创建
图 2 进程的控制
图 3 进程的控制
图 4 进程的控制
图 5 进程的控制(2)
图 6 进程的控制(2)
图 7 进程的控制(2)
六、编程体会
在这次的操作系统实验中,系统环境从Windows换为了Linux,开始的时候有很多地方都不是很适应。比如在Linux中的vim编辑器编写代码非常困难,因为很多的快捷键也忘的差不多了,而且编写习惯又与Windows下编译器有点不一样。之后就好多了,通过一个一个查阅资料,多敲了几遍代码,慢慢的也可以掌握一些Linux环境下的基础操作。在程序编写过程中,涉及了用fork()函数创建进程,lockf()函数对进程加锁,实现进程的创建撤销与控制。这些在以往的代码编写中是没有遇到的,遇到了很大的难题。比如fork()函数的具体作用是什么?如果使用?只好通过询问同学、老师,查询资料,慢慢的才理解fork()函数的真正意思。通过这次实验,使得自己对于进程的创建、撤销、控制等基本操作有了初步的了解,希望对今后的学习生活有所帮助。
文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。
原文链接:haihong.blog.csdn.net/article/details/108836361
- 点赞
- 收藏
- 关注作者
评论(0)