UC学习day09 更新进程的映像 环境变量 在程序中使用环境变量 管道 信号的基础

一 更新进程的映像
除了execve(2)之外,系统封装了一些库函数.
#include <unistd.h>
extern char **environ;
每个进程都维护着一个环境变量列表.environ这个全局变量指向了当前进程的环境变量列表的首地址.

int execl(const char *path, const char arg, …
/
(char *) NULL */);
int execlp(const char *file, const char arg, …
/
(char *) NULL */);
int execle(const char *path, const char arg, …
/
, (char ) NULL, 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[]);

exec
l 列表
v 向量表
p 环境变量PATH.file是文件的名字 path 是文件的路径
e 跟进程的环境变量相关.子进程继承父进程的环境变量.如果带e字符,用户可以使用自定义的环境变量替换掉从父进程继承来的环境变量列表

功能 返回值 跟execve(2)完全相同

创建一个子进程,将子进程的映像更换.
ps -o pid,ppid,pgrp,comm

编写代码使用全局变量 environ遍历当前进程的环境变量列表.
代码 t_env.c

char *envp[]; envp是常量
char **environ; environ是变量
使用main函数的envp遍历进程的环境变量.
t_env1.c

更新进程映像的时候,使用用户自定义的环境变量替换掉从父进程继承下来的环境变量.
exece.c

bash如何执行一个linux命令?
bash分为内部命令和外部命令 type command
bash的外部命令.
bash—>fork(2)—>exec(3)
|----->wait(2)
内部命令 内部命令就是bash程序的一部分而已.
$cd uc
char *argv={“cd”,“uc”,NULL};
不用fork.

编写代码实现自己的shell.
vi t_shell.c

二 环境变量 在程序中使用环境变量
getenv(3) setenv(3) unsetenv(3) clearenv(3)

#include <stdlib.h>
char *getenv(const char *name);
功能:在环境变量列表中查找环境变量,将环境变量的值的首地址返回
参数:
name:指定环境变量的名字
返回值:
NULL 找不到
成功 返回环境变量值的首地址

#include <stdlib.h>

int setenv(const char *name,const char *value,
int overwrite);
功能:改变或增加一个环境变量.
如果环境变量不存在,添加环境变量
如果环境变量已经存在,看overwrite的值
参数:
name:指定环境变量的名字
value:指定环境变量的值
overwrite:
非0 使用value的值替换掉环境变量原来的值
0 不改变
返回值:
成功 0
错误 -1 errno被设置

int unsetenv(const char *name);
功能:删除环境变量
参数:
name:指定环境变量的名字
返回值:
成功 0
错误 -1 errno被设置

#include <stdlib.h>
int clearenv(void);
功能:清除进程环境变量列表中的内容
参数:
返回值:
成功 0
非0 失败

举例说明 进程环境变量的操作
代码参见 env_os.c

三 管道
管道分为两类 有名管道 无名管道
主要应用于进程间通讯.

pipe(2)
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建一个管道
参数:
pipefd:数组的名字.指向了管道的两端.
pipefd[0] 指向了管道的读端
pipefd[1] 指向了管道的写端
返回值:
成功 0
错误 -1 errno被设置为相应错误码
无名管道主要应用于具有亲缘关系的进程间通讯.
使用无名管道实现进程间的通讯.
步骤:
1 父进程创建管道
2 创建子进程,子进程继承父进程的文件描述符
3 父进程负责向管道写入数据
4 子进程负责从管道读取数据,将读取到的数据输出到显示器

代码参见 pipe.c

有名管道 文件类型 管道文件
p
特点 文件没有内容.这个文件只是进程间通讯的接口.

mkfifo(3)

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
功能:创建一个有名管道文件
参数:
pathname:指定文件的名字
mode:指定文件的权限 (mode & ~umask)
返回值:
成功 0
错误 -1 errno被设置相应的错误码

举例说明 创建一个管道类型的文件.
fifo.c
pa.c 负责向管道文件写入数据
pb.c 负责从管道文件读取数据,将读取到的数据写到显示器

四 信号的基础
什么是信号?
信号就是软中断
软中断就是软件实现中断的机制.
中断
临界资源 多个执行流争抢的资源.
中断处理程序

系统为用户提供了哪些信号?
kill -l

信号经历的过程
产生信号 设置进程对信号的阻塞 信号抵达给进程 信号处理
未决状态 信号产生了,但是还没有对信号处理

处于未决状态的信号称为未决信号

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90112887
今日推荐