• 进程状态与环境变量的解析


    主要内容 :

    1、main函数下的命令行參数 

    2、环境变量的获取;

    3、验证进程中环境变量的存储位置  

    4、进程执行的状态

    1、命令行參数

    在学习C语言的时候,我们已经大致了解到了命令行參数的使用;
    今天我们在Linux系统下。来看看这些參数的使用;
    我们都知道main函数是有參数的:
    main函数的格式: int main(intargc ,char  *  argv[],char*  env)
    当中參数env表示的进程的环境变量 。

    。。

    前两个表示的就是
    argc  表示的命令的个数 
    argv[]表示的是命令(字符串)的集合
    我们来验证一下吧 !

    !!

    我们能够下一个代码来检验一下吧 !!

    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc ,char  *  argv[],char *env[])
    {
         int i = 0 ;
         for(i =0 ;i < argc;++i)
         {
            printf("%s ",argv[i]);
    
          }
        printf("
    ");
        return 0;
    }
    在Linux下得到的结果 !


    2、环境变量的获取

    要怎么样,。得到一个进程的环境变量呢??、
    在这里我想大家介绍三种方法:

    1)、使用第三个命令行參数env

    获取的方法:
    命令行參数env    类型是    指针数组   内部存放的就是  环境变量   最后以NULL结束  
    代码来展示一下吧!
    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc ,char  *  argv[],char *env[])
    {
          int i = 0;
          for(i= 0 ;env[i];++i)
          {
        
             printf("%s
     ",env[i]);         
    
         }
        printf("
    ");
    
        return 0;
    }
    

    2)、使用全局变量environ

    C库中定义的全局变量environ指向环境变量表,environ没有包括在不论什么头文件里,所以在使用时 要用extern声明。


    #include <stdio.h>
    int main()
    {
    	extern char **environ;
    	int i=0;
    	for(;environ[i]!=NULL;i++){
    		printf("%s
    ",environ[i]);
    	}
    	return 0;
    }

    3)、使用环境变量的获取函数 

    上面的environ指针,还有命令行參数env 能够查看全部环境变量字符串,可是不够方便,
    假设给出name要在环境变量表中查 找它相应的value,能够用getenv函数。


    函数 getenv(环境变量名)  
    getenv的返回值是指向value的指针,若未找到则为NULL;
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	//方法三:使用函数getenv(环境变量名)
         	char * name  = getenv("PATH");
         	printf("%s
    ",name);
    	return 0;
    }

    进程中环境变量的存储位置

    对于一个进成来说的、系统为该进程分配的内存大致都是这么几部分????


    我们来验证一下吧!!

    我们都知道对于代码定义的局部变量都是定义在 堆栈段。,,
    那么我们仅仅须要推断一下、环境变量的地址 究竟是在  局部变量的   高低址还是低地址
    代码实现
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	//查看环境变量在内存重点额存放位置 
            //基本的区域有:  代码段、静态区(初始化数据、未初始化数据)、堆、栈、未知区域
            int m = 0 ;
            printf("&m = %p
    ",&m);
            printf("&path =%p 
    ",&*env[0]);
    
    	return 0;
    }
    最后的结果:

    结果中局部变量m的地址在  环境变量PATH的低地址处,。,所以结论是正确的。。

    3、进程状态

    对于内存中 ,同一时间肯定不仅仅有一个进程,可是这么多的进程肯定不是处于执行的状态;
    所以对于每一个进程的PCB中都会包括一个 状态标识符
    对于进程来说、、、主要有以下这几种的状态:
    1、R (running)
    执行状态 、、、表示的是 当前进程在 执行队列中 
    2、S (sleeping)
    休眠状态、、、进程运行休眠的代码
    3、D (disk sleep)
    特殊的一种休眠状态 。;;
    4、T (stopped)
    停止状态 ,进程此时什么都不须要做
    5、t (tracing stop)
    该状态暂不解释
    6、X (dead)
    死亡状态。表示进程正在被父进程回收
    7、Z (zombie)
    僵尸状态 ,,,,表示的进程发生异常--------进程被回收   这段时间之内的状态 

    状态 S(sleeping)、D(disk sleep)、T(stopped)之间的不同之处

    S状态:浅度的休眠,进程此时运行的休眠的代码,可被系统唤醒;
    D状态:深度的休眠,进程进入到深度的睡眠状态,仅仅能自己将自己唤醒 ,进程一般在进行I/O的时候。状态会改变成是D状态,此状态下的进程不会被不论什么信号杀死。
    T状态:停止状态,该状态下的进程什么都不做 ;

    进程状态的转换图


    4、特殊的进程的解析

    我们常常会听到一些特别进程,以下我就来向大家解释这么两个特别的进程

    1、孤儿进程

    所谓的孤儿进程就是   父进程已经结束了,子进程被1号进程收养的进程 
    【进程演示 】
    我们来实际演示一下这个进程:
    以下是測试代码

    最后的执行结果:

    结果非常明显,当父进程结束之后。子进程的父进程的pid变成了 1号进程。

    2、僵尸进程

    这类进程就是。就是子进程已经结束 。可是父进程还在执行没有结束。。无法回收子进程,所以此时的子进程就属于是僵尸进程。
    【进程演示 】



    实现结果:

    当前的子进程就变成了是 僵尸状态。

  • 相关阅读:
    [笔记].新唐M051型号的后缀解读
    [转载].怎样理解阻抗匹配
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) TFTLCD(控制器为ILI9325)驱动
    [转载].关于STM32的CPU为32位,定时器却为16位的探讨
    [笔记][朝花夕拾][Multisim基础电路范例].第一章 RLC电路,第九节 基尔霍夫电流定律
    [原创].如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) ADS7843触摸屏驱动测试
    [笔记][朝花夕拾][Multisim基础电路范例].第一章 RLC电路,第十一节 叠加定理
    [笔记].怎样在IAR中加入编译所需库的头文件?
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) 从SD卡内读取图片文件,然后显示在TFTLCD上
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7350443.html
Copyright © 2020-2023  润新知