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

2019-07-12 18:07发布

进程可以使多个程序并发执行,用于改善资源利用率,并且提高系统的吞吐量;
它具有动态性、并发性、独立性、异步性、结构特性五中特性。
一、五个特性:
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! "); exit(1); } else if(pid==0)//如果成立,表示此时在子进程中 { printf("in the child process! "); } else //如果成立,表示此时在父进程中 { printf("in the parent process! "); } 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 ",(long)getpid());//输出父进程的PID printf("gvar=%d var=%d ",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 ",(long)getpid(),gvar,var); //父进程调用vfork()会被阻塞,需要在子进程中调用_exit()函数退出子进程,而不是调用exit()函数。 _exit(0); } else { //输出父进程的PID以及变量值 printf("the parent process id:%ld,gvar=%d var=%d ",(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