Open supergem3000 opened 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 这时候两个程序的管道就建立完成了。
19. 系统调用和 UNIX Shell (jyywiki.cn)
操作系统 Kernel = API + 对象 为用户封装操作系统API,Shell 即 Kernel 的外壳 Shell 是一门“把用户指令翻译成系统调用”的编程语言
假设执行了Shell程序ls | wc Shell程序执行时,三个文件描述符(0-标准输入,1-标准输出,2-标准错误输出)都是指向同一个终端。
ls | wc
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
这时候两个程序的管道就建立完成了。