🏆个人主页:企鹅不叫的博客
🌈专栏
- C语言初阶和进阶
- C项目
- Leetcode刷题
- 初阶数据结构与算法
- C++初阶和进阶
- 《深入理解计算机操作系统》
- 《高质量C/C++编程》
- Linux
⭐️ 博主码云gitee链接:代码仓库地址
⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!
💙系列文章💙
【Linux】第一章环境搭建和配置
【Linux】第二章常见指令和权限理解
【Linux】第三章Linux环境基础开发工具使用(yum+rzsz+vim+g++和gcc+gdb+make和Makefile+进度条+git)
【Linux】第四章 进程(冯诺依曼体系+操作系统+进程概念+PID和PPID+fork+运行状态和描述+进程优先级)
文章目录
💎一、概念补充
🏆1.进程竞争性
CPU资源等其他资源不够用,进程之间存在竞争性,所以出现了优先级
🏆2.进程独立性
一个进程是
内核结构task_truck+代码和数据
组成的,而linux系统是通过
进程地址空间
方式来保证进程的独立性
🏆3.并行
并行:多个进程在多个CPU下,同时运行
注意:多个进程都在系统中运行≠多个进程在系统中同时运行。
🏆4.并发
大部分操作系统都是
分时
的,操作系统会给每一个进程赋予一个时间片,这样在一个调度周期中,可以调用到每一个需要运行的进程,多个进程在一个CPU下采用进程切换的方式,基于时间片轮转的多个进程看起来同时推进,称之为并发。
时间片:即CPU分配给各个进程的时间。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
🏆5.进程优先级管理
操作系统管理不同优先级的进程是用一个哈希桶管理,同一个优先级的进程在同一个桶中,其中操作系统会用 swap 函数交换新老进程进行迭代。
🏆6.进程间切换
CPU存在寄存器,这些寄存器储存了进程的临时数据
inttest(){int a =10;return a;}intmain(){int b =test();return0;}
a的值会先放入寄存器中,销毁了之后,再把寄存器里面的值赋值给b
在进程的
task_struct
结构体中,就有一个专门的成员用于保存进程的上下文数据
- 上下文数据:进程在运行中产生的各种临时数据
- 当进程被剥离的时候,需要保存上下文数据
- 当进程恢复运行的时候,需要重新加载上下文数据
💎二、环境变量
🏆1.基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,它是系统中某些具有全局性质的变量,通常是为了满足某些系统的需求.
因为有环境变量的存在,运行系统指令如ls,不需要输入路径./
命令行变量就分为两种:普通变量和环境变量(全局),环境变量保存了程序相关的搜索路径,系统中的环境变量名叫 PATH,我们在 Linux 上可以通过 env 指令查看所有环境变量,那么 PATH 也是可以查出来的:
[Jungle@VM-20-8-centos:~]$ env | grep PATH LD_LIBRARY_PATH=:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64 PATH=/home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin
我们可以查看PATH内容
[Jungle@VM-20-8-centos:~]$ echo $PATH /home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin
🏆2.常见环境变量
USER:当前登录的用户
HOME:指定用户的主工作目录,即登录到 Linux 时的默认目录
LANG:当前的语言和编码设定
PATH:可执行命令的路径
SHELL:当前使用的命令行是什么,当前 shell ,通值就是 /usr/bash,使用shell时,默认环境变量是~/.bash_profile
LOGNAME:当前登录的用户名
PWD:当前所处路径
OLDPWD:上一个路径,使用cd -跳回上一个路径
HISTSIZE:系统会记录的历史命令条数
🏆3.查看环境变量-给PATH添加可执行文件
//echo $环境变量名 #查看环境变量[Jungle@VM-20-8-centos:~]$ echo $PATH //路径都以:作为分割/home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin
🏆4.环境变量命令
1.echo:显示某个环境变量值
[Jungle@VM-20-8-centos:~]$ echo $HOME /home/Jungle
2.export:设置一个新的环境变量
//export PATH = $PATH:……[Jungle@VM-20-8-centos:~]$ export PATH=$PATH:/home/wxj/c22 linux/test 36//创建变量并且添加[Jungle@VM-20-8-centos:~]$ export aaaa=1234[Jungle@VM-20-8-centos:~]$ env | grep aaaa aaaa=1234
3.env: 显示所有环境变量
4.unset: 清除环境变量
[Jungle@VM-20-8-centos:~]$ unset aaaa
5.set: 显示本地定义的shell变量和环境变量
🏆5.main函数三个参数介绍
mian 函数可以带参数,argc (命令个数,执行该可执行文件时传入的几个命令)、 char * argv[] (指针数组,存放了每一个命令的常量字符串)、char* env[](环境变量),其中char* env[]也是指针数组,每个程序会收到一个环境表,他就是这个指针数组,每个指针指向一个 ‘\0’ 结尾的环境字符串
介绍前两个参数应用
#include<stdio.h>#include<stdlib.h>//main函数可以带参数//第一个参数指代命令个数,执行该可执行文件时传入的几个命令//第二个参数是一个指针数组,存放了每一个命令的常量字符串intmain(int arg,char* argv[],char*envs[]){if(arg !=4){printf("Usage: %s [-a|-s|-m|-d] first second\n", argv[0]);return0;}int x =atoi(argv[2]);int y =atoi(argv[3]);if(strcmp("-a", argv[1])==0){printf("%d+%d=%d\n",x, y, x + y);}elseif(strcmp("-s", argv[1])==0){printf("%d-%d=%d\n",x, y, x - y);}elseif(strcmp("-m", argv[1])==0){printf("%d*%d=%d\n",x, y, x * y);}elseif(strcmp("-d", argv[1])==0&& y !=0){printf("%d/%d=%d\n",x, y, x / y);}else{printf("Usage: %s [-a|-s|-m|-d] first second\n", argv[0]);}return0;}
测试:
[Jungle@VM-20-8-centos:~/lesson12]$ ./main -m 103010*30=300[Jungle@VM-20-8-centos:~/lesson12]$ ./main -d 301030/10=3[Jungle@VM-20-8-centos:~/lesson12]$ ./main 1111 Usage:./test [-a|-s|-m|-d] first second
介绍第三个参数应用
//第一个参数指代命令个数,执行该可执行文件时传入的几个命令//第二个参数是一个指针数组,存放了每一个命令的常量字符串//第三个参数用于导入环境变量!intmain(int arg,char* argv[],char*envs[]){for(int i =0;envs[i];i++){printf("envs[%d]: %s\n",i,envs[i]);}return0;}
🏆6.通过代码获取环境变量-environ
记得包含头文件< unistd.h >
externchar** environ;printf("get env from [environ]\n");for(int i =0; environ[i]; i++){printf("%d: %s\n", i, environ[i]);}
🏆7.通过系统调用获取或设置环境变量-getenv()
写一个只有我自己可以运行的文件
intmain(int arg,char* argv[],char*envs[]){char* user =getenv("USER");//依据环境变量名获取环境变量if(strcasecmp(user,"Jungle")!=0)//strcasecmp忽略大小写{printf("权限禁止!\n");return-1;}printf("成功执行!\n");return0;}
通过
getenv
函数获取到环境变量中的
USER
,判断其与我自己设定的user是否相同。如果不同就拒绝执行,相同才成功执行
🏆8.环境变量具有全局属性
- 本地变量(局部)
- 环境变量(全局)
所谓的本地变量,其实是bash内部定义的变量,bash内部的本地变量,并不会被这些子进程所继承。
而环境变量具有全局属性,可以被子进程继承并获取。
版权归原作者 企鹅不叫 所有, 如有侵权,请联系我们删除。