有人可以为我解释这个Python代码吗?

时间:2014-09-02 04:13:17

标签: python pty

此代码在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:]

1 个答案:

答案 0 :(得分:4)

在类Unix操作系统中,启动新进程的方法是 fork 。这是通过fork()或其几个堂兄来完成的。它的作用是复制调用过程,实际上有两个完全相同的程序。

唯一的区别是fork()的返回值。父进程获取子进程的PID,子进程获得0。通常情况下,你有一个if语句,就像你要问的那样。

如果返回的PID是0,那么你就是“在孩子身上”。在这种情况下,孩子应该是一个shell,因此执行bash

否则,你是“在父母身边”。在这种情况下,父级确保子项的打开文件描述符(stdinstdoutstderr和任何打开的文件)执行它们应该执行的操作。

如果您选择OS类或只是尝试编写自己的shell,那么您将会非常关注这种模式。


关于您的其他问题,1os.write(1, data)中的含义是什么?

文件描述符是内核中数组的整数偏移量:

  • 0是stdin
  • 1是stdout
  • 2是stderr

即。该行只写入stdout

当您想要设置管道或重定向时,您只需更改这三个文件描述符的含义(查找dup2())。