Skip to content

Latest commit

 

History

History
82 lines (54 loc) · 2.72 KB

README.md

File metadata and controls

82 lines (54 loc) · 2.72 KB

lab2

Rust Shell

支持功能

  • 管道
  • 文件重定向
  • Ctrl-C
  • Ctrl-D
  • echo
  • set local variables
  • pass temporary environmental variables to program
  • alias
  • ...(more)

管道

主要使用std::process::Stdio实现

通过Stdioinherit(),Piped以及Commandstdin()

重定向

  • > write
  • >> append
  • < as input

管道与重定向

可以实现echo hello | cat < test.txt < test.md多输入的情形

lab2/test.mdlab2/test.txt为测试文件

Ctrl D

在读入的时候相当于读入空行。判断后执行和exit一样的行为

Ctrl C

在输入时按ctrl c需要再按Enter键才能显示下一个prompt,在sleep 5时按下ctrl c马上退出子进程并prompt

echo

简单的显示环境变量,本地变量

A=1 env

能够临时带变量运行

a=1 set | grep a=1set | grep a=1效果不同(假设之前没有设置a=1),其他可执行程序运行应该也可以

set

set显示当前所有本地变量

unset清空本地变量

Strace

  • mmap
    • 将文件或者设备映射到内存中
    • sys/mman.h中声明
    • void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
    • 其中addr为新的虚拟地址空间映射的起始地址;length表示映射长度;prot为该映射的内存保护,可以是PROT_NONE,PROT_EXEC,PROT_READ,PROT_WRITE;flag表示对该映射的更新是否对其他映射相同区域的进程可见;fdoffset分别表示文件描述符以及相应的地址偏移,映射从fd所指文件的offset开始
  • fstat
    • sys/types.h,sys/stat.h,unistd.h
    • int fstat(int fd, struct stat *statbuf)
    • 返回文件信息,该文件信息被statbuf指向。与stat()类似,不过stat函数通过路径指向文件,而fstat函数通过文件描述符指向文件
    • statbufst_mode表示文件类型和模式,st_size表示文件大小
  • rt_sigprocmask
    • signal.h
    • int rt_sigprocmask(int how, const kernel_sigset_t *set, kernel_sigset_t *oldset, size_t sigsetsize)
    • 获得或者改变调用线程的信号屏蔽(signal mask),signal mask用来表示对于调用者来说正在被阻塞的信号
    • how可以为SIG_BLOCK,SIG_UNBLOCK,SIG_SETMASK,分别表示将set加入现有的阻塞信号集;将set中的阻塞信号集从现有的阻塞信号集中移除;将现有的阻塞信号集设置为set。原来的signal mask值将存储在oldset中,如果oldset不是NULL的话。

很多地方采用直接unwrap()的方式,因此健壮性不是很强

alias

alias ll='ls -l'

稍微简单匹配了一下'",当然不支持换行等