进程的创建撤销和控制

一、实验名称
进程的创建撤销和控制
二、实验内容
学生独立设计用于描述进程的数据结构,完成进程的创建、同步和互斥。
三、实验原理和设计思路
在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');
}
}

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);
}
}

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);
}
}
}

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;
}

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 进程的创建

操作系统实验--进程的创建撤销和控制_i++

图 2 进程的控制

操作系统实验--进程的创建撤销和控制_i++_02

图 3 进程的控制

操作系统实验--进程的创建撤销和控制_i++_03

图 4 进程的控制

操作系统实验--进程的创建撤销和控制_加锁_04

图 5 进程的控制(2)

操作系统实验--进程的创建撤销和控制_进程的创建撤销和控制_05

图 6 进程的控制(2)

操作系统实验--进程的创建撤销和控制_操作系统_06

图 7 进程的控制(2)

操作系统实验--进程的创建撤销和控制_进程的创建撤销和控制_07

六、编程体会
         在这次的操作系统实验中,系统环境从Windows换为了Linux,开始的时候有很多地方都不是很适应。比如在Linux中的vim编辑器编写代码非常困难,因为很多的快捷键也忘的差不多了,而且编写习惯又与Windows下编译器有点不一样。之后就好多了,通过一个一个查阅资料,多敲了几遍代码,慢慢的也可以掌握一些Linux环境下的基础操作。在程序编写过程中,涉及了用fork()函数创建进程,lockf()函数对进程加锁,实现进程的创建撤销与控制。这些在以往的代码编写中是没有遇到的,遇到了很大的难题。比如fork()函数的具体作用是什么?如果使用?只好通过询问同学、老师,查询资料,慢慢的才理解fork()函数的真正意思。通过这次实验,使得自己对于进程的创建、撤销、控制等基本操作有了初步的了解,希望对今后的学习生活有所帮助。