主要内容 :
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("\n"); 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\n ",env[i]); } printf("\n"); 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\n",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\n",name); return 0; }
进程中环境变量的存储位置
对于一个进成来说的、系统为该进程分配的内存大致都是这么几部分????
我们来验证一下吧!!
!
我们都知道对于代码定义的局部变量都是定义在 堆栈段。,,
那么我们仅仅须要推断一下、环境变量的地址 究竟是在 局部变量的 高低址还是低地址
代码实现
#include <stdio.h> #include <stdlib.h> int main() { //查看环境变量在内存重点额存放位置 //基本的区域有: 代码段、静态区(初始化数据、未初始化数据)、堆、栈、未知区域 int m = 0 ; printf("&m = %p\n",&m); printf("&path =%p \n",&*env[0]); return 0; }
最后的结果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV1hfRWFzdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
结果中局部变量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号进程收养的进程
【进程演示 】
我们来实际演示一下这个进程:
以下是測试代码
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV1hfRWFzdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
最后的执行结果:
结果非常明显,当父进程结束之后。子进程的父进程的pid变成了 1号进程。
2、僵尸进程
这类进程就是。就是子进程已经结束 。可是父进程还在执行没有结束。。无法回收子进程,所以此时的子进程就属于是僵尸进程。
【进程演示 】
实现结果:
当前的子进程就变成了是 僵尸状态。