牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-04-19 投稿人: 浏览次数:1554

主要内容 :

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

2、环境变量的获取;

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

4、进程运行的状态

在学习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下得到的结果 !!!
要怎么样,,得到一个进程的环境变量呢??、 在这里我想大家介绍三种方法:

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的低地址处,,,所以结论是正确的。。。 对于内存中 ,同一时间肯定不只有一个进程,但是这么多的进程肯定不是处于运行的状态; 所以对于每个进程的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状态:停止状态,该状态下的进程什么都不做 ;

进程状态的转换图


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

1、孤儿进程

所谓的孤儿进程就是   父进程已经结束了,子进程被1号进程收养的进程  【进程演示 】 我们来实际演示一下这个进程: 下面是测试代码
最后的运行结果:
结果很明显,当父进程结束之后,子进程的父进程的pid变成了 1号进程。

2、僵尸进程

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


实现结果:
当前的子进程就变成了是 僵尸状态;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。