【Linux】linux进程--进程概念第三部分_孤儿进程、环境变量

1、孤儿进程

1)产生原因

      顾名思义,父进程先于子进程退出,子进程就变成了孤儿进程。

      对比僵尸进程讨论一下他们俩的异同:

不同之处相同之处
孤儿进程父进程先于子进程退出,子进程就变成了孤儿进程讨论的对象都是子进程
僵尸进程子进程先于父进程退出,子进程就会变成僵尸进程

2)代码模拟

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {  
  5   pid_t ret=fork();
  6   if(ret<0)
  7   {
  8     return 0;
  9   }else if(ret==0)
 10   {
 11     //child
 12     while(1)
 13     {
 14       printf("i am child process,pid=%d,ppid=%d\n",getpid(),getppid());
 15       sleep(1);
 16     }
 17   }else
 18   {
 19     //father
 20     printf("i am child process,pid=%d,ppid=%d\n",getpid(),getppid());                   
 21   }                                                              
 22   return 0;                                                      
 23 }

运行结果如下:

这样的话孤儿进程就被我们创造出来了,大家可以看到第一组父子进程的pid与ppid都是有着关联的,子进程的ppid就是父进程的pid;

父进程先退出之后,子进程没有了father,便自动归到了1号进程的麾下。

3)孤儿进程的退出信息由谁回收

1号进程:操作系统的init进程,操作系统很多进程都是由该进程创建出来的,孤儿进程的父进程变为1号进程就意味着该孤儿进程退出的时候,退出的状态信息由1号进程进行回收。

4)孤儿进程有危害吗?

孤儿进程没有任何危害,退出状态信息会被一号进程进行回收;

只有孤儿进程,没有孤儿状态!!

2、环境变量

1)什么是环境变量

环境变量:是指在操作系统中用来指定操作系统运行的一些参数;换句话说,操作系统通过环境变量来找到运行时的一些资源。

比如说:链接的时候,帮助链接器找到动态库(标准库的);

              执行命令的时候,帮助用户找到该命令在哪一个位置(例如ls)。

2)常见的一些环境变量

1、PATH:指定可执行程序的搜索路径,程序员执行的命令之所以能找到,全靠PATH变量;

2、HOME:登录到Linux操作系统的用户家目录;

3、SHELL:当前的命令解释器,默认是"/bin/bash",命令解释器本质上也是一个可执行程序,运行起来也是一个进程。

3)查看当前环境变量

1、env

显示:    环境变量名称=环境变量的值(使用' : '进行间隔)

示例:

2、echo  $[环境变量名称]

可以查看单个环境变量对应的值

示例:

4)环境变量对应的文件

1、系统级文件:针对各个用户都起作用(root用户可修改),强烈不推荐修改系统的环境变量文件,因为会影响其他用户;

2、用户级别环境变量文件:推荐大家修改这个文件,对自己用户的环境变量做出改变,只影响自己。

5)修改环境变量

命令范式:export  环境变量名称=[$环境变量名称] : [新添加的环境变量的内容]

1、命令行中直接修改:(特点:临时生效)如果是新增,可以不要[$环境变量名称],即export  环境变量名称=[新添加的环境变量的内容];如果修改老的,必须加上[$环境变量名称],否则之前的环境变量的值就找不到了。

 2、文件当中修改:(特点:修改完毕之后不会立即生效,需要配合 source  [环境变量文件名称])如果是新增,则在文件末尾直接添加:export  环境变量=[新添加的环境变量的内容];如果修改老的,在老的后面添加“ : [新添加的环境变量的内容]”。

6)环境变量的组织方式

环境变量是以字符指针数组的方式进行存储的,最后的元素以NULL结尾(当程序拿到环境变量的时候,读取到NULL,就代表着读取完毕)

7)代码获取环境变量

1、main函数的参数

     int main(int argc,char* argv[],char* enc[])

#include<stdio.h>
  /*
   * 命令行参数的
   * 1、命令行参数的个数
   * 2、命令行参数的值
   * 
   * 3、环境变量*/
int main(int argc,char* argv[],char* env[])
{
  for(int i=0;env[i]!=NULL;i++)
  {                                                                                                 
    printf("====[%s]\n",env[i]);         
  }
  return 0;
}

2、environ

     environ char  **environ:全局的外部变量,在C#的标准库当中定义的,使用时需要用extren关键字。

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

3、getenv

#include<stdio.h>
#include<stdlib.h>

int main()
{
   printf("====PATH=%s\n",getenv("PATH"));
   return 0;
}

8)将可执行程序的路径设置到PATH环境变量,可以省去“./”

为什么执行程序要加上“./”呢,以为要告诉命令行参数bash要执行的程序在当前路径下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值