linux进程

来源:互联网 发布:免费淘宝全套模板下载 编辑:程序博客网 时间:2024/05/29 19:40

进程与程序、线程区别:

一、概念:

进程:进行当中的一次过程。进程是动态的。程序:是一些保存在硬盘上的可执行的代码。程序是静态的。线程:是计算机中独立运行的最小单位,运行时占用很少的系统资源。多进程和多线程都是并行执行,进程与进程之间、线程与线程之间都是独立执行的。

二 进程的标识:

进程是通过唯一的进程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进程回收。

  1. 创建进程
    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()函数
*/
2. 退出进程
exit,return, _exit,abort区别
exit:是一个函数,有参数,在头文件stdlib中声明。0标识正常退出,1表示异常退出;exit把控制权交给系统,return 把控制权交给调用函数。
_exit:在头文件unistd中,_exit(),执行后立即返回给内核。
return:是函数执行完后的返回。
abort:异常终止。
3.执行新进程
exec函数族
execl:链表
execv: 容器
execp:带环境变量
1.执行新进程
2.简单的库函数实现。