环境变量、system(day10)
一、环境变量
bash下的环境变量。
每个进程都默认从父进程继承环境变量
bash本身就是一个程序,这个程序运行的时候,bash进程
可以定义只能之自己这个进程中使用的变量,这种变量称为自定义变量。
用户可以使用
export 环境变量的名字
将自定义变量变为环境变量。环境变量可以被子进程继承。 如何使用程序访问环境变量?
系统维护着一个全局变量 extern char **environ;
这个全局变量的名字就是环境变量列表的首地址。
借用这个全局变量,遍历环境变量列表。
代码参见 trav_l.c int main()
int main(void)
int main(int argc,char *argv[])
int main(int argc,char *argv[],char *envp[])
使用int main(int argc,char *argv[],char *envp[])遍历环境变量的列表。代码参见trav_l1.c 操作环境变量的函数
getenv()
#include <stdlib.h>
char *getenv(const char *name);
功能:获取环境变量的值
参数:
name:指定了环境变量的名字
返回值:
找不到为NULL
返回环境变量值字符串的首地址 环境变量的操作 代码参见 env_op.c putenv()
#include <stdlib.h>
int putenv(char *string);
功能:增加或改变环境变量的值
参数:
string:name=value格式。如果name不存在,增加到环境变量列表。
如果存在,将环境变量的值改为value。
返回值:
成功0 非0 失败 setenv()
#include <stdlib.h>
int setenv(const char *name,const char *value,int overwrite);
功能:增加或改变一个环境变量
参数:
name:指定环境变量的名字
value:指定环境变量的值
overwrite:如果环境变量存在,overwrite设置为非0,改变环境变量的值为value;如果overwrite设置为0,环境变量的值不改变。 返回值:
成功
- 错误 errno被设置 int unsetenv(const char *name);
功能:删除环境变量
参数:
name:指定了要删除的环境变量
返回值:
成功
- 错误 errno被设置
clearenv() 二、加载新的映像
使用新的映像替换旧的映像。
加载新的映像使用execve()家族的函数
#include <unistd.h>
int execve(const char *filename, char *const argv[],
char *const envp[]);
功能:执行程序
参数:
filename:指定了要执行的程序。必须是可执行文件
argv:是传递给程序的参数。相当于命令行参数的传递
envp:是传递给程序的环境变量 返回值:
- 错误 errno被设置
成功 不返回。 execl()
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]); int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]); l:需要将argv数组中的每个元素罗列出来,传给函数
v:传递的是指针数组的首地址
p:PATH环境变量。如果带p,到PATH环境变量指定的路径下找命令。如果不带p,必须告诉程序可执行文件的路径。
e:如果带e,可以在程序加载的过程中设定环境变量。如果不带e。代表新的进程默认继承父进程的环境变量。 day10$ps -o "pid,ppid,pgrp,comm"
PID PPID PGRP COMMAND
bash
ps 举例说明 execve()的使用,加载新的映像。
代码参见 execve.c 举例说明 在子进程中加载新的映像。
代码参见 exec_ps.c perl
bash
python 补充:
在bash下键入a.out的时候,发生了什么?
bash调用fork()创建子进程,然后使用exec()系列的函数将a.out的映像替换掉子进程从父进程继承下来的映像。这也是所有的bash外部命令运行的原理。 bash运行环境下了,命令分为两种,一种是外部命令
另一种是内部命令。
如何查看一个命令是内部命令还是外部命令
type 命令 内部命令和外部命令的原理是什么?
内部命令的实现在bash程序中,和bash属于同一个程序。在内部命令执行的时候,不需要创建子进程。内部命令的执行和bash是同一个进程。 外部命令就是和bash不是同一个程序。执行外部命令的时候,就fork() exec() 外部命令的执行和bash的执行不是同一个进程 fork()和exec()的配合使用
fork()只是创建了进程的空间。但是exec才更新了fork()出来的子进程映像。 作业:
自己编写代码实现bash的功能。编译生成可执行文件 psh。
内部命令和外部命令
cd 三、system()的使用
#include <stdlib.h>
int system(const char *command);
功能:执行一个shell命令
参数:
command:指定了linux的shell命令
返回值:
错误 -
command的退出状态码。 /bin/sh -c command bash---->fork----->fork--->fork
a.out sh ls
bash--->fork
a.out ls 举例说明 system()的使用 代码参见system.c
编写代码实现延时功能 代码参见 delay.c 四、文件输入重定向的实现
利用学过的知识实现文件输入重定向的功能。
编写代码 实现输入字符串,将字符串转换为大写,然后输出。
代码参见 upper.c
ctrl+d EOF 编写代码对upper.c进行封装,实现文件输入重定向的功能。
代码参见 wrap.c 总结:
一、环境变量
二、使用新的映像替换旧的映像
三、system的使用
四、文件输入重定向
作业:
环境变量、system(day10)的更多相关文章
- Atititcmd cli环境变量的调用设置与使用
Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs 系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...
- java中获取系统属性以及环境变量
java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...
- java 获取系统变量(环境变量和设置变量)
前言 环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说, 环境变量的处理可能会 ...
- java 获取系统变量(环境变量和环境变量)
前言 环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说. 环境变量的处理可能会 ...
- Java获取环境变量
Java 获取环境变量Java 获取环境变量的方式很简单: System.getEnv() 得到所有的环境变量System.getEnv(key) 得到某个环境变量的值 Map map = Syst ...
- Spring中如何向 Bean注入系统属性或环境变量
[转自] http://unmi.cc/spring-injection-system-properties-env/ 在 Spring 中为 javabean 注入属性文件中的属性值一般人都知道的, ...
- java 读取环境变量和系统变量的方法
在web开发的过程中不免需要读取一些自定义的jvm系统变量或者环境变量.比如定义一些通用的log文件.或者数据库访问路径. 我们可以使用System.getProperties()读取所有的系统变量. ...
- Java 获取环境变量
Java 获取环境变量Java 获取环境变量的方式很简单: System.getEnv() 得到所有的环境变量System.getEnv(key) 得到某个环境变量的值 由于某些需要,可能要下载某些 ...
- Java获取环境变量和系统属性
Java获取服务器环境变量和JVM系统变量 当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时,Java提供了System类的静态方法getenv()和getProperty() ...
随机推荐
- 臣妾做不到啊---记团队内首次尝试HOLACRACY管理会议
"易穷则变,变则通.通则久". --<系辞传>下篇的第二章 实践敏捷方法接近两年,瓶颈效应逐渐显现.计穷力竭之时.有幸了解到HOLACRACY.购买了市面上唯一一本中文 ...
- Android自己定义Toast
一.引言 在开发的过程中你会发现Android自身的Toast提示有很多限制,比方我想自己定义Toast的动画.自己定义一个美观的View显示在Toast中.很多其它的是让Toast显示指定的时长等等 ...
- WCF学习笔记——配置服务引用
WCF传过来的东西要序列化. 比如,在WCF服务中,象这么个方法 public IEnumerable<UserItem> GetUserList() 默认情况下,在客户端会调用,是这样: ...
- null in JavaScript
C# String.IsNullOrEmpty Javascript equivalent https://stackoverflow.com/questions/5746947/c-sharp-st ...
- ES transport client使用
ES transport client bulk insert 传输(transport)客户端 TransportClient利用transport模块远程连接一个elasticsearch集群.它 ...
- ASP.NET快速开发框架不得不做的几个功能、高大上档次后台管理UI界面
俗话说磨刀不误砍柴工,确实,一早上花一个小时去磨刀一天下来肯定能多砍很多柴.我们做软件开发也是同样的道理,有套好开发框架在手里,开发也是事半功倍.那么一套MVC快速开发框架至少得具有哪些功能才能帮我们 ...
- [HDU4689]Derangement
https://zybuluo.com/ysner/note/1232641 题面 给出\(b_1,b_2,...,b_n\in\{−1,1\}\),求满足\((p_i−i)*b_i<0\)的\ ...
- MySQL:常见错误01
ylbtech-MySQL:常见错误01 1.返回顶部 1. [SQL]select * from product_product_tag aLEFT JOIN system_tag b on b.i ...
- Java中继承,类的高级概念的知识点
1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...
- Gym - 101981D The 2018 ICPC Asia Nanjing Regional Contest D.Country Meow 最小球覆盖
题面 题意:给你100个三维空间里的点,让你求一个点,使得他到所有点距离最大的值最小,也就是让你找一个最小的球覆盖掉这n个点 题解:红书模板题,这题也因为数据小,精度也不高,所以也可以用随机算法,模拟 ...