一、环境变量
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)的更多相关文章

  1. Atititcmd cli环境变量的调用设置与使用

    Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs  系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...

  2. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  3. java 获取系统变量(环境变量和设置变量)

    前言 环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说, 环境变量的处理可能会 ...

  4. java 获取系统变量(环境变量和环境变量)

    前言 环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说. 环境变量的处理可能会 ...

  5. Java获取环境变量

    Java 获取环境变量Java 获取环境变量的方式很简单: System.getEnv()  得到所有的环境变量System.getEnv(key) 得到某个环境变量的值 Map map = Syst ...

  6. Spring中如何向 Bean注入系统属性或环境变量

    [转自] http://unmi.cc/spring-injection-system-properties-env/ 在 Spring 中为 javabean 注入属性文件中的属性值一般人都知道的, ...

  7. java 读取环境变量和系统变量的方法

    在web开发的过程中不免需要读取一些自定义的jvm系统变量或者环境变量.比如定义一些通用的log文件.或者数据库访问路径. 我们可以使用System.getProperties()读取所有的系统变量. ...

  8. Java 获取环境变量

    Java 获取环境变量Java 获取环境变量的方式很简单: System.getEnv()  得到所有的环境变量System.getEnv(key) 得到某个环境变量的值 由于某些需要,可能要下载某些 ...

  9. Java获取环境变量和系统属性

    Java获取服务器环境变量和JVM系统变量    当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时,Java提供了System类的静态方法getenv()和getProperty() ...

随机推荐

  1. ORACLE11G 将dataguard的rman备份恢复到測试环境的单机oracle中的具体过程

    . 也就是说此时数据库仅仅能进行不全然恢复了,在打开数据库时得使用resetlogs打开. recover database until scn 11412370952; RMAN> recov ...

  2. STM32的独立看门狗

    STM32 内 部自带了 2 个看门狗:独立看门狗(IWDG)和窗体看门狗(WWDG) STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动.即使主时钟发生问题.它也仍然 有效. 这里须要注 ...

  3. 一个jeecg整合activiti的学习样例,源代码下载

    社区成员:刘京华採用技术:jeecg+ activiti源代码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示:  2.jpg (71.81 KB, 下载次数: 0) ...

  4. Swift版本UIWebView长按保存图片

    起因 最近需要做个IOS的壳子,用到长按保存图片的功能,发现百度出来的全是OC语法的例子,很多都不是全面,只能自己写一份Swift版本的,图片下面附上Github地址 效果图 Github地址:htt ...

  5. Android+Jquery Mobile学习系列(6)-个人信息设置

    本节开始,进行代码的实战练习.我的这个App是管理保险客户信息的,数据采用Sqlite存储在本地手机上,第一次使用需要先登记自己的个人信息,这个功能非常简单,也无关紧要,我是拿这个练手,方便做后面复杂 ...

  6. UESTC--1251--谕神的密码(贪心)

     谕神的密码 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit Status ...

  7. bzoj 1556 墓地秘密 —— 状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556 预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了: 但预处理很麻烦.. ...

  8. TCP打开文件传输(客户端code)

    #include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/types. ...

  9. C - Crazy Town

    Problem description Crazy Town is a plane on which there are n infinite line roads. Each road is def ...

  10. Elasticsearch之curl删除索引库

    关于curl创建索引库的介绍,请移步 Elasticsearch之curl创建索引库 [hadoop@djt002 elasticsearch-2.4.3]$ curl -XPUT 'http://1 ...