环境变量、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() ...
随机推荐
- [转]趣题:一个n位数平均有多少个单调区间?---- From Matrix67
考虑这么一个 14 位数 02565413989732 ,如图所示,它的数字先逐渐变大,然后开始变小,再变大,再变小,再变大,再变小.我们就说,它一共包含了 6 个单调区间.我们的问题就是:一个 n ...
- Eclipse集成Resinserver
因为Resin在Eclipse下的表现丝毫不亚于Tomcat,小编决定带领众小弟一起学习使用Resin.虽然小编身边也没有什么大牛在使用Resin,但看到Resin的广告已经吹到天边了.所以还 ...
- iOS刷新某个cell时候crash
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadSec ...
- Extjs4,form提交时emptyText传值问题
在Extjs4中,form提交时,文本框的emptyText会传到后台,比如 上图中的“请选择”这样的文本会作为值传到后台. 解决方法: form提交时配置 submitEmptyText: fal ...
- 动手分析安卓仿QQ联系人列表TreeView控件
因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码. 一. 需要用 ...
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决
Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...
- FreeWheel基于Go的实践经验漫谈——GC是大坑(关键业务场景不用),web框架尚未统一,和c++性能相比难说
摘自:http://www.infoq.com/cn/news/2017/06/freewheel-experience-on-go Go语言是FreeWheel公司目前主要力推的一个方向,在其看来, ...
- E20170809-mk
collapse n. 垮台; (身体的) 衰弱; vt. 使倒塌; 使坍塌; 使瓦解; vi. 崩溃; 倒塌; 折叠; (尤指工作劳累后 ...
- python3和python2共存 django-admin Fatal error in launcher: Unable to create process using ‘"‘
python3和python2共存 django-admin Fatal error in launcher: Unable to create process using ‘"‘ 出现这个 ...
- Java 介绍比较全面的一遍文章
Java简介 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称.用Java实现的HotJava浏览器(支持Java ...