gem-universe / blog

0 stars 0 forks source link

[操作系统]19. 系统调用和 UNIX Shell #23

Open supergem3000 opened 8 months ago

supergem3000 commented 8 months ago

19. 系统调用和 UNIX Shell (jyywiki.cn)

(UNIX) Shell

操作系统 Kernel = API + 对象 为用户封装操作系统API,Shell 即 Kernel 的外壳 Shell 是一门“把用户指令翻译成系统调用”的编程语言

理解管道

假设执行了Shell程序ls | wc Shell程序执行时,三个文件描述符(0-标准输入,1-标准输出,2-标准错误输出)都是指向同一个终端。

Process 1
0 <-> /dev/pts/8
1 <-> /dev/pts/8
2 <-> /dev/pts/8

Shell先自己fork一份,自己这个进程进入wait态。 子进程解析Shell命令,系统调用SYS_pipe,创建一个管道,分配出两个文件描述符。

Process 2
0 <-> /dev/pts/8
1 <-> /dev/pts/8
2 <-> /dev/pts/8
3 <-- [== pipe ==] // 连接到管道的读口
4 --> [== pipe ==] // 连接到管道的写口,注意这里和上面是同一个管道

这时Process 2又执行了一次fork,此时Process 3的文件描述符和2一致。 接着Process 3执行系统调用把文件描述符1关闭,把管道的写口给文件描述符1,再把文件描述符3,4关闭。最后Process 3通过execve,变成管道左侧的指令。

Process 3
0 <-> /dev/pts/8
1 --> [== pipe ==] // 连接到管道的写口
2 <-> /dev/pts/8

Process 2又创建了一个进程Process 4,动作和Process 3类似,把文件描述符0关闭,把管道的读口给文件描述符0,再把文件描述符3,4关闭。最后变成管道右侧的指令。

Process 4
0 <-- [== pipe ==] // 连接到管道的读口
1 <-> /dev/pts/8
2 <-> /dev/pts/8

这时候两个程序的管道就建立完成了。