进程参数和环境变量

1. cmdline

main函数的格式: int main(intargc ,char  *  argv[],char*  env)
其中参数env表示的进程的环境变量 。。。
前两个表示的就是
argc  表示的命令的个数 
argv[]表示的是命令(字符串)的集合
我们来验证一下吧 !!!
我们可以下一个代码来检验一下吧 !!
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(int argc ,char  *  argv[],char *env[])  
  4. {  
  5.      int i = 0 ;  
  6.      for(i =0 ;i < argc;++i)  
  7.      {  
  8.         printf("%s ",argv[i]);  
  9.   
  10.       }  
  11.     printf("\n");  
  12.     return 0;  
  13. }  


2、环境变量的获取


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

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

获取的方法:
命令行参数env    类型是    指针数组   内部存放的就是  环境变量   最后以NULL结束  
代码来展示一下吧!
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(int argc ,char  *  argv[],char *env[])  
  4. {  
  5.       int i = 0;  
  6.       for(i0 ;env[i];++i)  
  7.       {  
  8.       
  9.          printf("%s\n ",env[i]);           
  10.   
  11.      }  
  12.     printf("\n");  
  13.   
  14.     return 0;  
  15. }  

2)、使用全局变量environ


C库中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     extern char **environ;  
  5.     int i=0;  
  6.     for(;environ[i]!=NULL;i++){  
  7.         printf("%s\n",environ[i]);  
  8.     }  
  9.     return 0;  
  10. }  


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


上面的environ指针,还有命令行参数env 可以查看所有环境变量字符串,但是不够方便,
如果给出name要在环境变量表中查 找它对应的value,可以用getenv函数。
函数 getenv(环境变量名)  
getenv的返回值是指向value的指针,若未找到则为NULL;
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.     //方法三:使用函数getenv(环境变量名)  
  6.         char * name  = getenv("PATH");  
  7.         printf("%s\n",name);  
  8.     return 0;  
  9. }  



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

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



我们来验证一下吧!!!
我们都知道对于代码定义的局部变量都是定义在 堆栈段,,,

那么我们只需要判断一下、环境变量的地址 到底是在  局部变量的   高低址还是低地址

代码实现
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.     //查看环境变量在内存重点额存放位置   
  6.         //主要的区域有:  代码段、静态区(初始化数据、未初始化数据)、堆、栈、未知区域  
  7.         int m = 0 ;  
  8.         printf("&m = %p\n",&m);  
  9.         printf("&path =%p \n",&*env[0]);  
  10.   
  11.     return 0;  
  12. }  

最后的结果:

结果中局部变量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、僵尸进程

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

【进程演示 】



实现结果:



当前的子进程就变成了是 僵尸状态;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值