• Linux 进程


    转载:http://blog.sina.com.cn/s/blog_69708ebe0100rc3i.html

    1.什么是进程

    1,通俗来讲,进程是系统中正在运行的一个程序,程序一旦运行就是进程。但要把进程和程序区分开来,程序代码储存在内存空间,它是静态的,它是保存在磁盘上的指令的有序集合,没有任何执行的概念,而进程是动态的,它的生命周期有三种状态:就绪态,执行态,等待态。一个进程执行后可以被消亡,但是程序依然存在,只是此时这个程序不执行而已;

    2,进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

    3,一个程序运行起来可产生一个或多个进程,一个进程也可以包含多个程序,他们不是一一对应关系
    4,进程是系统的基本调度单位,那么怎样区分不同的进程呢?每个进程都有自己的身份证(进程标识),其中最重要的标识是进程号(PID)和它的父进程号(PPID),他们都是非零的正整数,可分别通过getpid()getppid()得到进程号和父进程号;

    linux中的进程包含三个段:
         数据段:存放全局变量,常数以及动态数据分配的数据空间(如malloc函数取得的空间)等;
         代码段:当然是存代码!!!
         堆栈断:存子程序的返回地址,子程序的参数和局部变量;

    2.进程的相关函数

    linux中,进程的执行分用户模式和内核模式;用户进程可在两种模式下运行;
    创建进程:
         fork();在一个进程中创建一个新进程(子进程),该子进程完全拷贝了父进程的全部内容(复制父进程数据和堆栈空间等);
         vfork()fork()有一个区别: Linux使用copy-on-writeCOW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。
         exec函数族:提供了一个在进程中启动另一个执行程序的方法;exec函数族共有6个函数,具体用法请查看linux_c函数参考手册,下面是几个例子供参考:

    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
           
     int main()
    {
        if(fork()==0)   //若返回值为0,是子进程
        {
         if(execl("/bin/rm","rm","hello",NULL)<0)
         perror("execlp error ");
        }
        return 0;
    }
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        if(fork()==0)   //子进程
        {
         if(execlp("touch","touch","hello",NULL)<0)
         perror("execlp error ");
        }
        return 0;
    
    }

     exit()_exit();这两个函数都是用来终止进程的,区别就在exit()在终止进程前要检查文件打开的情况,会把缓冲区的数据写回文件,这个操作跟“缓冲IO”有关,自己去想吧!!

      _exit()直接结束进程。

      wait()和waitpid()
       怎样用自己去看书,我直接给出例子,不要怪我哦,我打字打到这里是在太累了,哈:

    #include<sys/types.h>
    #include<sys/wait.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pc,pr;
        pc=fork();//产生一个子进程
        if(pc<0)//出错
        perror("fork");
       
        else if(pc==0) //返回值为0,是子进程
        {
         sleep(5);
         exit(0);
        }
        else   //为父进程
        {
        do
        {
         pr=waitpid(pc,NULL,WNOHANG);
         
         if(pr==0)
         {
          printf("the child process has not exit
    ");
          sleep(1);
         }
        }while(pr==0);
            
        if(pr==pc)
        printf("Get child %d",pr);
        else
        printf("somer error occured");
         }
    }



  • 相关阅读:
    keil 提示"running with code size limit 32k"
    关于C语言编译出现give arg types警告问题
    windows10添加设备管理器的快捷方式到桌面
    deepin20社区版 安装 STM32CubeIDE 小记
    STM32开发 printf和scanf函数的重定向——修改HAL标准库用printf函数发送数据直接输出
    ardupilot环境配置之eclipse指定jdk版本启动,解决“Version XXXX of the JVM is not ......"报错的问题
    jdk9,10,11,12没有jre安装方法
    C++ 类构造函数 & 析构函数
    STM32 Keil中关于stlink的调试 下载设置
    STM32 SWD下载出现no target connect解决方法
  • 原文地址:https://www.cnblogs.com/guojun-junguo/p/9931617.html
Copyright © 2020-2023  润新知