嵌入式LinuxC编程之进程控制(一)

进程可以使多个程序并发执行,用于改善资源利用率,并且提高系统的吞吐量;
它具有动态性、并发性、独立性、异步性、结构特性五中特性。
一、五个特性:
1、动态性:进程是程序的执行,是程序在处理机上执行时的一个活动;
2、并发性:多程序可以同时运行在一个内存空间中;
3、独立性:同内存中有多个进程,但独有自己的虚拟内存空间,故互不干扰。并且是独立获得资源和调度的基本单位;
4、异步性:每个进程按照各自的速度进行;
5、结构特性:每个进程都有自己的私有空间,在私有空间中,进程在内存中的结构由代码段、数据段和堆栈段构成。
二、进程相关信息
1、进程ID:每个进程独有的ID号;
2、进程状态:运行、等待、结束等三种基本状态,另外还有就绪、挂起、僵尸等状态;
3、进程切换:运行的进程让出处理器的使用权,交给另一个进程执行;
4、虚拟内存:每个进程都运行在自己的虚拟内存中,功能:拥有巨大的寻址空间、可以共享虚拟内存和对进程保护等。
三、进程的基本操作
1、fork()函数:创建一个新的进程,复制父进程的所有资源,创建后根据返回值判断:
  返回0:表示在子进程中;
  返回子进程的PID:表示在父进程中;
  返回值小于零:创建子进程失败,没有足够的内存空间。

2、如下程序:执行后,发现数据返回了两次,说明父进程执行了一次,子进程执行了一次。返回值的不同执行情况不同,但返回顺序不是固定的。

#include
#include
#include
#include
int main(void)
{
	pid_t pid;
	if((pid=fork())<0)//如果小于零,表示创建子进程失败
	{
		printf("fork error!\n");
		exit(1);
	}
	else if(pid==0)//如果成立,表示此时在子进程中
	{
		printf("in the child process!\n");
	}
	else //如果成立,表示此时在父进程中
	{
		printf("in the parent process!\n");
	}
	exit(0);
}
结果:in the child process!
	  in the parent process!(输出结果顺序不是确定的)
3、vfork()函数,如下代码:与fork()函数不同的是,他不会复制父进程的所有资源,父子进程共享地址空间。

#include
#include
#include
int gvar=2;//全局变量
int main(void)
{
	pid_t pid;
	int var=5;//局部变量
	printf("process id:%ld\n",(long)getpid());//输出父进程的PID
	printf("gvar=%d var=%d\n",gvar,var);
	if((pid=vfork())<0)//创建子进程失败
	{
		perror("error!");
		return 1;
	}
	else if(pid==0)//如果在子进程中执行以下程序
	{
		gvar--;
		var++;
		//输出子进程的PID和修改后的变量值
		printf("the child process id:%ld,gvar=%d var=%d\n",(long)getpid(),gvar,var);
		//父进程调用vfork()会被阻塞,需要在子进程中调用_exit()函数退出子进程,而不是调用exit()函数。
		_exit(0);
	}
	else
	{   //输出父进程的PID以及变量值
		printf("the parent process id:%ld,gvar=%d var=%d\n",(long)getpid(),gvar,var);
		return 0;
	}
}
执行结果:process id:3858
		  gvar=2 var=5
		  the child process id:3859,gvar=1,var=6 
		  the parent process id:3858,gvar=1,var=6 



你可能感兴趣的:(嵌入式LinuxC进程)