栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

系统编程 day04 (函数 fork ,wait ,waitpid vfork进程的定义,进程的特点)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

系统编程 day04 (函数 fork ,wait ,waitpid vfork进程的定义,进程的特点)

1.什么是进程? 定义:1进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。

2.进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其余的进程。每个进程运行在其各自的虚拟地址空间中,进程之间可以通过由内核控制的机制相互通讯。

3.进程的空间分配




4.进程的结构

程序代码区:存放应用程序的可执行代码。

全局数据区:(静态数据区)存放应用程序的全局数据和静态数据,它们的生命期与应用程序的生命期一相同,即从应用程序开始运行时起至停止运行时止。全局数据与静态数据的内存空间均是在编译时分配的。

栈:局部变量存放在栈中,它们的内存空间是在程序运行时动态分配的。运行时确定的内存。

堆:动态分配内存所分配的空间都是堆中的。



5.外存的数据结构



6.PCB块:task_struct:进程控制块

1进程状态相关:当前进程的状态     

2进行调度信息相关:进程优先级     

3标识符相关:用来控制进程对系统中文件和设备的存取权限  

4进程间通信相关:信号、管道     //System V IPC:共享内存、信号灯、消息队列



7.进程与程序的区别?

进程与程序的区别与联系

1、程序是静态的,进程是动态的,进程是操作系统分配资源的基本单位。     //进程有一定的生命期,而程序是指令和数据的集合。

2、1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。

3进程依存于程序(进程由程序而生)。



8.进程的状态

1.新建态:对应于进程被创建时的状态,尚未进入就绪队列。

2.就绪态:一切都准备好了,就等着cpu分配时间了,毕竟内存中有很多进程在并发运行。这叫做就绪态。

3.运行态:进程正在运行。

4停止态:ctrl + z : 让一个进程暂时停止。没有结束,但是也没有运行。暂停键。T.--->用ps - aux可以查看进程的状态。

5.等待(wait)态:进程在等待一个事件的发生或某种系统资源又称为阻塞(blocked)态或睡眠(sleep)态。

6.僵尸状态:进程已经没有可执行的代码。但是内存空间也没有被回收。子进程的空间由创建它的进程(父进程)来回收。



 9.进程类型

1交互进程。可以用命令与内核进行交互。

2守护进程。在内存中运行,结果不输出到屏幕。

3批处理进程:和终端无关,被提交到一个作业队列中以便于顺序执行一般系统管理员经常用到。




10.进程类型转换

1.    停止 ctrl +c

2     由前台转停止:  ctrl + z   符号:s+ -> T;

3     fg命令:让停止进程,后台的进程在前台运行。T->S+ S->S+

4     bg命令,让停止的进程在后台运行起来。T -> S  

5     jobs:查看前台停止的进程。

6     fg + 编号:让停止的前台进程运行起来。




 11.内存中各个进程的执行原则

1    时间片轮转原则

2   优先级原则

3   抢占式原则




12.进程的特点

    (1)动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。

(2)并发性:任何进程都可以同其他进程一起并发执行。

(3)独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源的独立单位;

(4)异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进




13.函数的介绍 与代码 :

1.fork  函数   作用:主要是生成子进程  

2.wait 函数    作用: 防止孤儿进程  (代码里会说)

3.waitpid  函数  作用 :防止孤儿进程  wait 的升级版本

4.exit   函数   作用:    退出函数 

5. vfork  函数 作用 : 创建子进程 , 防止孤儿进程 与 exit()  函数 必须一起使用。




14.代码 : 

1.fork ( void ) 函数    (基本功能)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc,char *argv[])
{
	printf("this is start n");
	int a= fork();
	if(a==0)   //子进程
	{
		printf("this is o zin ");
	}
	else if(a>0)  //父进程
	{
		printf("this is overn");
		sleep(1);
	}
	else  //没有执行成功
	{
		printf("creat is  errorn");
	}

       return 0;

}

2.程序的功能   测试 进程 : 独立 并发 :时间片轮转 抢占 优先级 的特性

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


//进程  : 独立  并发 :时间片轮转 抢占  优先级  异步 动态
int main(int argc,char *argv[])
{
	printf("this is %s test startn",__func__);  //(__func__ 执行的函数的名字 )
	pid_t pid =fork();
	if(pid <0)
	{
		perror("fork errorn");
	}
	else if(pid >0 )
	{
		printf("this is parent process : %s start: %d %d n ",__func__,getpid(),getppid());
		printf("son is pid: %dn : ",pid);



		printf("this is parent process : %s end: %d  %d n",__func__,getpid(),getppid());
		sleep(1);
	}
	else if(pid ==0)
	{
		printf("this is child process :start: %d   %d  n",getpid(),getppid());
		printf("this is child process :end   %d   %dn",getpid(),getppid());
	}
	printf("this is %s   test overn", __func__);


       return 0;

}

3.程序的功能 : 测试进程的独立性 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include



//1.进程的独立性
//子任务从fork 以后 完全复制了父进程的所有的代码与数据 ,但是有自己的进程号
//父进程有的数据 ,子进程也有.只是选择执行.
int mum=100;
int main(int argc,char *argv[])
{

		pid_t pid =fork();
		if(pid<0)
		{
			exit(0);  //正常退出
		}
		if(pid>0)  //父进程
		{
			printf("this is parent process : %d,  num=%dn",getpid(),++mum);
			sleep(1);
		}
		if(pid ==0)
		{
			printf("this is child process %d  num=%d  n ",getpid(),--mum);
		}

       return 0;

}

4.程序的功能:

 //双任务基本结构
//cpu 调度策略 : 优先级 抢占 时间片轮转
//父进程抢占 1 2 3 4 4
//子进程抢占 1 3 4 2 4

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

//双任务基本结构
//cpu 调度策略 : 优先级 抢占 时间片轮转
//父进程抢占 1 2 3 4 4
//子进程抢占 1 3 4 2 4
int main(int argc,char *argv[])
{
	int mun =100;
	printf("text1n ");
	pid_t pid = vfork();
	if(pid<0)
	{
		perror("fork error n");
		exit(0);
	}
	else if(pid >0)
	{
		sleep(1);    //使父进程开始时 交出时间片轮转
		printf("text2n");
		printf("this iss parent process :%d n",getpid());
		sleep(2);//回收子进程 防止孤儿进程
	}
	else if(pid ==0)
	{
		printf("text3n");
		printf("this is child process : %d n",getpid());
		exit(0);
	}
	printf("text4n");

       return 0;

}

5.程序的功能: 父进程每秒向终端输入 时间

                            子进程向文本输入字符串

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

//双任务基本结构
//cpu 调度策略 : 优先级 抢占 时间片轮转
//父进程每秒输出时间到屏幕上
//子进程每秒输出hello linux 到文本中
void time1()
{
	time_t tm1 =time(NULL); //输出函
	char *s = ctime(&tm1);
	fputs(s,stdout);
							
}



void wenzi()
{
	char W[1000]={"hello linux "};
	FILE* fp =fopen("1.txt","a+");
	fprintf(fp,"%sn",W);
	fclose(fp);
							
}



int main(int argc,char *argv[])
{
	pid_t pid = fork();
	if(pid<0)
	{
		perror("fork error n");
		exit(0);
	}
	else if(pid >0)
	{
		while(1)
		{
			sleep(1);//回收子进程 防止孤儿进程
			time1();
		}
	}
	else if(pid ==0)
	{
		while(1)
		{
			sleep(1);
			wenzi();
		}
	}
       return 0;

}

6.程序功能: 创建  三个进程一起运行 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc,char *argv[])
{
		pid_t a =fork();
		if(a<0)
		{
			printf("fork errorn");
			exit(0);
		}
		else if(a==0)   //这里变成了两个  //最后运行看有几个进程号
		{

			printf("1 zi this is parent :%d n",getpid());
			pid_t b=fork();
			if(b<0)
			{
				perror("2 fork errorn");
			}
			else if(b==0)
			{
				printf("2 zi this is %dn",getpid());
			}
			else
			{
				printf("2 parent this is %d n",getpid());
				sleep(1);
			}

		}
		else if(a>0)  //这里一个 
		{
			printf("1  parent this is parent :%d n",getpid());
			sleep(1);
		}
       	return 0;

}

 

7.程序功能:sleep 函数 来防止 孤儿进程

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

//1.孤儿进程: 父进程执行完毕 ,被他的父进程回收空间.不能回收他创建的子进程  子进程代码太多 , 导致不受终端控制的状态
// 2.危害系统安全 , 要减少孤儿状态 ,
// 3.避免的方法    让父进程后结束 , sleep  ,wait waitpid vfork
// 4. 孤儿被系统 领养 可以用 kill 控制状态
int main(int argc,char *argv[])
{
		
		pid_t pid =fork();
		if(pid <0 )
		{
			exit(0);
		}
		//父进程
		else if(pid >0 )
		{
			printf("this is  parents process  :%d  start n",getpid());
			int aa=1000;
			while(aa--)
			{
				printf("this is parents   process test %d n",getpid());
				sleep(1);
			}
				
			printf("this is  parents process  :%d  end n",getpid());
		}
		//子进程
		else if(pid ==0)
		{
			int num =100;
			printf("this is  child process  :%d  start n",getpid());
			while(num--)
			{
				printf("this is child  process test %d n",getpid());
				sleep(1);
			}
			printf("this is  child  process  :%d  start n",getpid());
		
		}


       return 0;

}

8.程序功能:wait ,waitpid 函数解决孤儿进程 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

//1.孤儿进程: 父进程执行完毕 ,被他的父进程回收空间.不能回收他创建的子进程  子进程代码太多 , 导致不受终端控制的状态
// 2.危害系统安全 , 要减少孤儿状态 ,
// 3.避免的方法    让父进程后结束 , sleep  ,wait waitpid vfork
// 4. 孤儿被系统 领养 可以用 kill 控制状态
int main(int argc,char *argv[])
{
		
		pid_t pid =fork();
		if(pid <0 )
		{
			exit(0);
		}
		//父进程
		else if(pid >0 )
		{
			printf("this is  parents process  :%d  start n",getpid());

            //wait函数的第一种用法
		//	pid_t waitpid =wait(NULL);
		//	printf("waitpid  %dn    pid :%d n",waitpid ,pid);//
		//	普通的模式使用 防止孤儿进程的产生


            //wait函数的第二种用法
			int status=0; //status 装载子进程的退出状态
		//	pid_t waitpid =wait(&status );
		//	printf(" exit: %d n",WEXITSTATUS(status));  //接受子进程的返回状态
		//	printf("this is  parents process  :%d  end n",getpid());



		//waitpid 函数的使用
		pid_t waitson1 = waitpid(pid,&status,0);  //精确到进程号的 进程
		printf(" exit: %d n",WEXITSTATUS(status));  //接受子进程的返回状态
		



		}
		//子进程
		else if(pid ==0)
		{
			int num =10;
			printf("this is  child process  :%d  start n",getpid());
			while(num--)
			{
				printf("this is child  process test %d n",getpid());
				sleep(1);
			}
			printf("this is  child  process  :%d  start n",getpid());
			exit(3); //退出状态  这个数传到父进程
		}


       return 0;

}

9.vfork 函数的使用  (必须和exit 函数一起用  不然核心已转储)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


// vfork()  与 exit 一起使用才行
int main(int argc,char *argv[])
{
		
		pid_t pid =vfork();
		if(pid <0 )
		{
			exit(0);
		}
		//父进程
		else if(pid >0 )
		{
			printf("this is  parents process  :%d  start n",getpid());
			printf("this is  parents process  :%d  end n",getpid());
			

		}
		//子进程
		else if(pid ==0)
		{
			int num =10;
			printf("this is  child process  :%d  start n",getpid());
			while(num--)
			{
				printf("this is child  process test %d n",getpid());
				sleep(1);
			}
			printf("this is  child  process  :%d  start n",getpid());
			exit(0);//(注意这里)
		}


       return 0;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号