进程与程序、线程区别:
一、概念:
进程:进行当中的一次过程。进程是动态的。
程序:是一些保存在硬盘上的可执行的代码。程序是静态的。
线程:是计算机中独立运行的最小单位,运行时占用很少的系统资源。
多进程和多线程都是并行执行,进程与进程之间、线程与线程之间都是独立执行的。
二 进程的标识:
进程是通过唯一的进程ID标识。进程的ID是一个非负数。
ID为0的进程,称为系统进程,是内核的一部分,不执行任何磁盘上的程序。
ID为1的进程,称为init进程,是所有孤儿进程的父进程。
ID为2的进程,称为页守护进程,支持虚拟存储系统的分页操作。
三、进程的结构
代码段:存放可执行的代码,通常属于只读。
数据段:存放程序的全局变量、常量、静态变量
堆栈段:
栈区:主要用于函数调用,存放函数的参数、函数内部定义的局部变量
堆区:用于存放动态分配的内存变量
如:
#include<stdio.h>
#define PI 3.14//数据段
double area(double a)
{
double ar;//栈区
ar = PI*a*a;
return ar;
}
double perimeter(double a)
{
double pe;//栈区
pe=2*PI*a;
return pe;
}
int main()
{
double ar,pe;
double r=1.40;//栈区
ar=area(r);
pe=perimeter(r);
printf("ar=%lf\n",ar);
printf("pe=%lf\n",pe);
return 0;
}
四、进程的操作
进程分为:
僵尸进程:当子进程先于父进程终止,而父进程么有调用wait函数等待子进程结束(进程描述符还在),那么子进程处于僵尸状态。
孤儿进程:父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程回收。
- 创建进程
fork 、vfork
相同点:调用一次,返回两次。
不同点:
fork:创建的子进程完全复制父进程的资源,只不过独立父进程,为了实现并发性。
子进程和父进程哪个先运行,取决于系统的调度算法。一般情况下,父进程会调用wait()函数,等待子进程先结束。
vfork:创建的子进程与父进程共享地址空间,子进程修改地址空间的任何数据,父进程可见。
vfork:保证了子进程先运行,当子进程调用了exec函数族或者调用exit()函数后,父进程才可能被调度运行。
进程创建
int main()
{
pid_t cpid;
cpid=fork();
if(cpid == 0)
{
sleep(2);
printf(" child pid=%d\n",getpid());//获取子进程号
}
else if(cpid>0)
{
int status;
//sleep(1);
printf("parent pid=%d\n",getpid());//获取父进程号
wait(&status);//返回等待子进程的id号
}
else
{
printf("fork process fail.\n");
}
return 0;
}
1.父进程先结束,会造成孤儿进程
2.子进程先结束,父进程么有调用wait()函数,会造成僵进程
3.父进程调用wait()函数
- 退出进程
exit,return, _exit,abort区别
exit:是一个函数,有参数,在头文件stdlib中声明。0标识正常退出,1表示异常退出;exit把控制权交给系统,return 把控制权交给调用函数。
_exit:在头文件unistd中,_exit(),执行后立即返回给内核。
return:是函数执行完后的返回。
abort:异常终止。
3.执行新进程
exec函数族
execl:链表
execv: 容器
execp:带环境变量
1.执行新进程
2.简单的库函数实现。