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

主要内容 :

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、僵尸进程

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

【进程演示 】

实现结果:

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

时间: 2024-09-30 16:13:43

进程状态与环境变量的解析的相关文章

JDK搭配环境变量

进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk,以jdk-8u131-windows-x64为例 2.安装jdk-8u13-windows-x64 3.配置环境变量:右击"我的电脑"-->"高级系统设置"-->"环境变量" 1)在系统变量里新建JAVA_HOME变量,变量值为:C:\Program Files\Java\jdk1.6.0_14(根据自己的安装路径填写) 2)新建classpat

Linux下的PATH环境变量详细用法

linux PATH环境变量全解析 关于PATH的作用: PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径. 比如在根目录/下可以输入命令ls, 在/usr目录下也可以输入ls, 但其实ls这个命令根本不在这个两个目录下. 事实上当你输入命令的时候LINUX会去/bin,/usr/bin,/sbin等目录下面去找你此时输入的命令, 而PATH的值恰恰就是/bin:/sbin:/usr/bin:--. 其中的冒号使目录与目录之间隔开. 关于新增自定义路径

JDK(Java SE Development Kit)的安装与环境变量的配置

本文参考于:http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html 感谢作者的贡献~ 首先,进入网址下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 然后,安装JDK.在安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件

OK335xS U-boot 环境变量解析

/************************************************************************************************** * OK335xS U-boot 环境变量解析 * 声明: * 本文主要是为了知道OK335xS U-boot环境变量设置.如何选择启动方式等等内容. * * 2015-9-28 晴 深圳 南山平山村 曾剑锋 *********************************************

I.MX6 Linux U-boot 环境变量解析

/********************************************************************************** * I.MX6 Linux U-boot 环境变量解析 * 声明: * 在分析完I.MX6 Manufacturing Tool V2 (MFGTool2)中一些内容之后,这里仅仅是 * 为了验证其中的一些想法: * 1. 如何读取不在分区中的uImage,而是在emmc中1M地址上的uImage: * 2. U-boot的loa

新手理解的bash环境变量解析漏洞

p{ line-height:150%; font-size:18px; font-family:fangsong; margin-top:20px; } pre {font-size:15px; background-color:black; color: white;font-family: sans-serif } #refer{background-color:gray;} h1 {font-family:simhei;} 1 环境变量是什么 无论是Windows程序还是Linux程序,

JDK环境变量解析

设置环境变量 在java 中需要设置三个环境变量(1.5之后不用再设置classpath了,但个人强烈建议继续设置以保证向下兼用问题)JDK安装完成之后我们来设置环境变量:右击“我的电脑”,选择“属性”,选择“高级”标签,进入环境变量设置,分别设置如下三个环境变量: (1)配置path变量: 为什么要配置path变量?因为电脑系统将根据该变量的值找到java编程中需要的一些程序,比如javac.exe.java.exe.javah.exe等等,其中javac.exe程序是用于编译java源代码,

环境变量LD_LIBRARY_PATH的传递

http://bbs.chinaunix.net/thread-3680861-1-1.html execv明显没有传环境变量,execle或execve才会带在启动shell设置的LD_LIBRARY_PATH根本传不到b程序 http://bbs.pediy.com/thread-217130.htm 为了使 Set-UID 程序更加安全,不受LD_LIBRARY_PATH环境变量的影响, 运行时的链接器或加载器(ld.so)会忽略环境变量,如果程序是个 Set-UID 程序. http:/

linux中修改PATH环境变量

如何修改PATH环境变量 1.1 什么是环境变量 1.linux里面哪里都可以使用,内容一般都不会发生变化 2.大写 3.PATH LANG 4.修改环境变量的时候前面要加上export 1.2 PATH含义 作用 PATH变量里面存放的是linux下面命令的位置. 1.3 linux下面运行命令的过程 ####1)输入 ls ####2) ls是否在PATH这些路径/目录中 ####3)如果有就执行 解析 ####4)如果没有则提示 command not found 1.4 模拟环境 ##1