2014-09-02 130 views
0

此代碼在Python中創建pty(僞終端)。我曾評論說,我不明白有人可以爲我解釋這個Python代碼嗎?

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:] 

回答

4

在類Unix操作系統的部分,開始一個新的進程的方式是。這是通過fork()或其幾個堂兄完成的。它所做的是重複調用過程,實際上有兩個完全相同的程序。

唯一的區別是fork()的返回值。父進程獲取子進程的PID,並且子進程得到0。通常發生的事情是,你有一條if語句,就像你所詢問的那樣。

如果返回的PID是0那麼你是「在孩子身上」。在這種情況下,孩子應該是一個外殼,所以bash被執行。

否則,你是「在父母身上」。在這種情況下,父級確保孩子的打開文件描述符(stdin,stdout,stderr和任何打開的文件)完成他們應有的操作。

如果你曾經學過一門操作系統課,或者只是試着編寫自己的shell,那麼你將會很多地使用這種模式。


至於你的其他問題,什麼是1os.write(1, data)是什麼意思?

文件描述符是整數偏移到內核內的數組:

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

即線剛寫入stdout

當您想要設置管道或重定向時,您只需更改這三個文件描述符的含義(查找dup2())。

+0

很好的解釋,但父母和孩子並行運行? – Gray 2014-09-02 11:02:03

+0

那麼孩子的標準輸出和標準輸入會發生什麼,他們會被重定向到父母? – Gray 2014-09-02 11:25:01

+0

這兩個過程是*相同*。這意味着它們具有相同的'stdout'等。如果你想重定向,那麼你必須自己設置它。 – Adam 2014-09-02 16:10:04

相關問題