愛在花開的季節 发表于 2024-10-2 02:14:16

[Linux]僵尸进程,孤儿进程,情况变量

https://i-blog.csdnimg.cn/direct/ae80b29ab42d43baabd6fdbac0839544.png
   希望你开心,希望你康健,希望你幸福,希望你点赞!
末了的末了,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很紧张!
一个小插曲~

   严肃的问题,猫猫和花花可以兼得吗?
https://i-blog.csdnimg.cn/direct/5342198fdf5d4cc7b32eb256a819b15d.png
答案是不可以,猫猫吃了花花,会嘎掉!
僵尸进程

僵尸进程是操纵体系中一个常见的概念,具体指已经终止但仍然占用体系资源的进程。僵尸进程的形成紧张是由于父进程在子进程终止后没有精确处理子进程的退出状态。以下是对僵尸进程的具体解析:
定义与特性



[*] 定义
[*]僵尸进程是指子进程已经结束运行,但父进程还未对其举行善后处理(如调用wait()或waitpid()函数)的状态。此时,子进程的进程描述符(PCB)仍然保存在体系中,占用一定的内存空间。
[*] 特性
[*]僵尸进程不再斲丧CPU资源,但它们的进程描述符(PCB)仍然存在于体系中,这意味着它们会占用一定的内存资源。假如体系中存在大量的僵尸进程,可能会导致体系资源的浪费和性能下降。
产生缘故原由

僵尸进程的产生通常是由于父进程没有调用wait()或waitpid()等函数来清理子进程的状态。当子进程结束时,它会发送一个SIGCHLD信号给父进程,通知父进程它已经结束。假如父进程没有处理这个信号大概没有调用wait()系列函数来清理子进程的状态,子进程就会变成僵尸进程。
解决方法

为了解决僵尸进程问题,可以采取以下几种方法:

[*]使用wait()或waitpid()体系调用:父进程可以通过调用wait()或waitpid()函数来获取子进程的退出状态,并清理子进程所占用的资源。
[*]忽略SIGCHLD信号:父进程可以使用signal()函数将SIGCHLD信号的处理函数设置为SIG_IGN,体现忽略该信号。这样,在子进程终止后,内核会自动回收子进程的资源,不会产生僵尸进程。
[*]使用双向管道举行进程间通信:父进程可以创建一个双向管道,子进程在终止时通过管道发送一个消息给父进程。父进程在接收到消息后调用wait()或waitpid()来处理子进程的终止状态。
[*]监控和清理僵尸进程:可以使用体系命令(如ps、grep等)来查找僵尸进程,并通过杀死其父进程来间接清理僵尸进程。但请注意,直接杀死僵尸进程是不可能的,由于它们已经处于殒命状态。
注意事项



[*]僵尸进程本身不能被直接杀死,由于它们已经殒命,但是它们的状态信息仍然保存在体系中。
[*]假如体系中出现大量僵尸进程,可能需要查抄体系上的步调是否存在问题,大概是否存在某些服务或进程管理不妥的情况。
[*]频繁地出现僵尸进程可能表明体系或应用步调中存在问题,需要进一步的调查和修复。
https://i-blog.csdnimg.cn/direct/1e65b18e8a6b4aabbf0d0493c84613ed.png
https://i-blog.csdnimg.cn/direct/4401fda6c30b4fe69324d243da0f0652.png
孤儿进程

   孤儿进程是操纵体系中的一个概念,具体指的是在其父进程执行完成或被终止后仍继承运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态网络工作。
产生缘故原由

在类UNIX操纵体系中,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永久无法预测子进程到底什么时候结束。当一个父进程由于正常完成工作而退出或由于其他情况被终止,而它的一个或多个子进程却还在运行,那么这些仍在运行的子进程就会成为孤儿进程。
处理机制

为避免孤儿进程退出时无法释放所占用的资源而僵死,进程号为1的init进程会担当这些孤儿进程,这一过程也被称为“收养”(英语:re-parenting)。init进程会循环地调用wait()函数来等候其已经退出的子进程,包罗这些被收养的孤儿进程。当孤儿进程结束时,init进程会负责清理它们的状态和资源,确保体系资源的有用回收。
特点与影响



[*]无父进程:孤儿进程是没有父进程的进程,它们的父进程ID会被设置为1,即init进程的ID。
[*]资源回收:由于init进程的存在,孤儿进程在结束时可以或许确保其占用的资源得到回收,因此孤儿进程本身并不会对体系造成危害。
[*]常见现象:在Unix/Linux体系中,孤儿进程是正常现象,体系可以或许自动处理它们的状态和资源回收问题。
https://i-blog.csdnimg.cn/direct/3c298933c78e491da7e3e7e34bde68bd.png
https://i-blog.csdnimg.cn/direct/23fc1b7eaec34692b73cdf856b466b88.png
情况变量

   Linux情况变量是操纵体系中用来指定操纵体系运行情况的一些参数,是操纵体系为了满足差别的应用场景预先在体系内设置的一大批全局变量。以下是关于Linux情况变量的具体解析:
一、情况变量的分类

Linux情况变量可以按照差别的标准举行分类,紧张包罗以下几种:

[*]按照生命周期分类:

[*]临时情况变量:用户利用export命令在当前终端下声明情况变量,关闭Shell终端后失效。
[*]永世情况变量:在情况变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相称于永世生效。

[*]按照作用域分类:

[*]体系情况变量:对所有用户和进程都可见,通常在体系启动时被设置,并被所有用户和进程共享。
[*]用户情况变量:每个用户独立设置,只对该用户及其相关进程可见。这些变量可以在登录时通过差别的配置文件(如.bashrc、.bash_profile、.profile等)设置。
[*]进程情况变量:由特定进程设置,并且仅对该进程及其子进程可见。

二、常见的情况变量

Linux体系中有很多常用的情况变量,它们各自承担着差别的作用,以下是一些常见的情况变量:


[*]PATH:决定了shell将到哪些目次中寻找命令或步调。它是一系列由冒号分隔的目次,当输入一个命令时,shell会按照PATH中定义的次序去这些目次中查找可执行文件。
[*]HOME:当前用户主目次的路径。
[*]USER:当前用户的用户名。
[*]SHELL:当前用户默认使用的shell范例。
[*]LANG:指定体系的默认语言。
[*]LD_LIBRARY_PATH:指定体系在哪些目次中查找共享库文件。
[*]TERM:指定当前终端的范例。
[*]PS1:定义命令行提示符的格式。
三、查看情况变量

在Linux中,可以使用多种方法来查看情况变量:


[*]echo命令:例如,echo $PATH可以查看PATH情况变量的值。
[*]printenv命令:列出所有情况变量及其对应的值。
[*]env命令:与printenv雷同,也是用于显示所有情况变量。
[*]set命令:显示当前shell的当地定义的情况变量和局部变量。
四、添加和删除情况变量

添加情况变量


[*]临时添加:

[*]使用export命令在当前终端下声明情况变量,例如export PATH=$PATH:/new/path。这种方法只对当前终端有用,关闭终端后失效。

[*]永世添加:

[*]编辑用户的个人配置文件(如.bashrc、.bash_profile、.profile等),在其中添加export命令,然后生存并退出。之后,可以通过执行source ~/.bashrc(或相应的配置文件)来使更改立刻生效,大概在下次登录时自动生效。

删除情况变量


[*]临时删除:

[*]使用unset命令,例如unset PATH(这会删除整个PATH情况变量,通常不保举这样做),大概更精细地删除PATH中的某个特定路径(这需要使用一些字符串处理本事)。

[*]永世删除:

[*]编辑相应的配置文件,删除或注释掉相应的export命令,然后生存并退出。之后,通过执行source命令或重新登录来使更改生效。

五、情况变量的作用

   情况变量在体系当中通常具有全局属性,可以被子进程继承。它们对于体系的正常运行和步调的执行起着至关紧张的作用。通过合理设置情况变量,可以方便地控制步调的运行情况,进步体系的灵活性和可配置性。
六、情况变量的加载次序

在Linux体系中,情况变量的加载次序通常遵循以下规则(可能因发行版而异):

[*]/etc/environment(假如存在):这是体系级的情况变量配置文件,对所有用户都有用。
[*]/etc/profile:这是体系级的全局配置文件,对所有用户都有用。它会调用其他配置文件,如/etc/bash.bashrc等。
[*]~/.bash_profile、~/.bash_login、~/.profile(按此次序查找):这些是用户级的配置文件,用于设置用户个性化的情况变量。bash shell会按照次序查找这些文件,并执行找到的第一个文件。
[*]~/.bashrc:这是bash shell特有的配置文件,用于设置bash shell的特定配置和情况变量。每次打开新的bash shell时,该文件都会被执行。
https://i-blog.csdnimg.cn/direct/b6be3c6cf2264534bf407b09cf44786e.png
code:code.c
        gcc -o $@ $^ -std=c99
.PHONY:clean
clean:
        rm -f code

#include <stdio.h>
#include <unistd.h>
#include <string.h>

// code -opt1/-opt2/-opt3
int main(int argc, char *argv[], char *env[])
{
   printf("我是一个进程,我的pid: %d\n", getpid());
         for(int i=0; env; i++)
         {
             printf("env[%d]: %s\n", i, env);
         }

         if(argc != 2)
         {
             printf("Usage: code opt\n");
             return 1;
         }

         if(strcmp(argv, "-opt1") == 0)
         {
             printf("功能1\n");
         }
         else if(strcmp(argv, "-opt2") == 0)
         {
             printf("功能2\n");
         }
         else if(strcmp(argv, "-opt3") == 0)
         {
             printf("功能3\n");
         }
         else
         {
             printf("默认功能\n");
         }
return 0;
}
   希望你开心,希望你康健,希望你幸福,希望你点赞!
末了的末了,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很紧张!
https://i-blog.csdnimg.cn/direct/f352ebe0c5214ba68728660e02f5fb89.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: [Linux]僵尸进程,孤儿进程,情况变量