Linux进程控制(下)

简介: Linux进程控制

我们发现,如果没有自定义环境变量,系统自带的环境变量就会被打印,但是如果自定义环境变量系统自带的环境变量就不会被打印。

那么如果我两个都想要怎么办呢?

这个函数传入你的自定义环境变量就可以了,作用就是将你定义的环境变量导入到系统当中。

这里穿插一个问题,一个程序运行之前,是先调用main还是先调用exec函数呢?

是先调用exec函数,因为它的作用上面说了,是将程序加载到内存中,Linux中,它就是加载器。

调用exec函数之后会将自己的参数等等传给main函数,这就是为什么之前说main函数有三个参数,谁传给他的。

int execvpe(const char *file, const char *argv[], …,char *const envp[]);

这个参数就不说了,都说过了。

注意:上面这些接口都是execve系统调用,其他的都是封装,为了让我们有更好的选择性。

模拟实现简易的shell

首先来利用main函数的参数来实现一个功能:

那么我们可有利用这个模拟实现一个简单的shell。

第一步先设置输入和输出,并且创建一个字符数组储存输入的参数。

我们输入一个字符串是abc,然后会按回车,也就是说实际上是abc\n,如果我要在打印信息%s后面加一个\n那么就会多出一行,不加容易出现缓冲区不刷新问题,所以我们要去除输入末尾的\n。

第二步要进行字符串分割,因为我们在屏幕输入的是ls -a -l这种,但是exec函数要用到的是字符指针数组类型的,所以我们创建一个字符指针数组,然后进行分割放进字符指针数组:

这里要说一下内建命令,我们在输入ls什么的时候不同文件会有颜色,但是如果调用exec里面就需要自己添加颜色选项,我们又不能在屏幕输入,所以只能在代码中添加,首先判断一定要是ls命令才行,然后添加颜色选项。

像这种不需要让子进程来执行,而是shell自己执行的就叫做内建命令。

第三步是打印,创建一个子进程帮我们工作,这是因为exec函数会替换掉原来程序中所有的代码和数据:

然后我们还可以设置一个条件编译来看看字符指针数组中的字符切割是否正确:

先来测试一下上面的程序是否正确

但是如果我们输入cd …就会发现根本没有任何变化,这是为什么呢?

先创建一个其他程序来看一下一个进程的状态:

用ls /proc/pid -al

cwd是当前进程的工作目录,也是我们平时说的当前路径,exe是当前程序执行的是磁盘路径的哪一个程序。

那么这个当前路径可以改变嘛?通过一个函数是可以的:

谁调用这个函数就更改谁的工作目录,参数是更改到哪个目录。

如果更改了工作目录,那么以后这个程序再进行创建文件等等操作,就会再新的工作目录创建,因为系统默认是跟可执行程序同一个目录下去创建新文件。

那么刚才我们的shell不能cd …是因为他只能让当前工作目录发生变化,因为shell是通过创建子进程去执行命令,我们让目录进行变化的时候是让子进程去帮助执行,也就是说改变的其实是子进程的目录,和父进程没有任何关系,所以说这里还需要创建一个内建命令:

之有前还有一个命令,是echo $?,返回的是最近一次退出码

首先创建两个全局变量保存退出码和信号,然后再用他们储存子进程返回的结果:

最后进行判断:

这里简单的完善一下就可以了,主要是综合了上面所说的大部分内容。

相关文章
|
12天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
35 1
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
44 0
|
7天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
15天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
134 4
linux进程管理万字详解!!!
|
20天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
72 8
|
28天前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
58 1
|
28天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
70 4