此代码在Python中创建pty(伪终端)。我评论了我不理解的部分
import os,select
pid, master_fd =os.forkpty() #I guess this function return the next available pid and fd
args=['/bin/bash']
if pid == 0:#I have no I idea what this if statement does, however I have noticed that it get executed twice
os.execlp('/bin/bash',*args)
while 1:
r,w,e=select.select([master_fd,0], [], [])
for i in r:
if i==master_fd:
data=os.read(master_fd, 1024)
"""Why I cannot do something like
f=open('/dev/pts/'+master_fd,'r')
data=f.read()"""
os.write(1, data) # What does 1 mean???
elif i==0:
data = os.read(0, 1024)
while data!='':
n = os.write(master_fd, data)
data = data[n:]
答案 0 :(得分:4)
在类Unix操作系统中,启动新进程的方法是 fork 。这是通过fork()
或其几个堂兄来完成的。它的作用是复制调用过程,实际上有两个完全相同的程序。
唯一的区别是fork()
的返回值。父进程获取子进程的PID,子进程获得0
。通常情况下,你有一个if语句,就像你要问的那样。
如果返回的PID是0
,那么你就是“在孩子身上”。在这种情况下,孩子应该是一个shell,因此执行bash
。
否则,你是“在父母身边”。在这种情况下,父级确保子项的打开文件描述符(stdin
,stdout
,stderr
和任何打开的文件)执行它们应该执行的操作。
如果您选择OS类或只是尝试编写自己的shell,那么您将会非常关注这种模式。
关于您的其他问题,1
在os.write(1, data)
中的含义是什么?
文件描述符是内核中数组的整数偏移量:
stdin
stdout
stderr
即。该行只写入stdout
。
当您想要设置管道或重定向时,您只需更改这三个文件描述符的含义(查找dup2()
)。