2016-04-24 30 views
-1

我有以下一段包含if-else語句的代碼。當我打印它時,即使執行了if部分,它看起來仍然執行了else部分。我與貓-A運行它,並縮進看起來很好即使在python中執行IF stmt,也執行ELSE stmt

print "PRINT os.fork" 
pid = os.fork() 
if pid: 
    print "PRINT IF %d" %pid 
    os.close(write_fd) 
    self.pid2file[pid] = read_fd 
else: 
    print "PRINT ELSE" 
    signal.signal(signal.SIGTERM, signal.SIG_DFL)$ 

這裏是輸出:

PRINT os.fork 
PRINT IF 63185 
PRINT ELSE 

順便說一句,所有的代碼都駐留在一個循環中。

我很欣賞這種行爲的任何想法...

+0

你可以在那裏使用fork()。所以會有兩個過程:一個是pid = 0(孩子),另一個是pid =某事(父母)。父母將進入如果分支,孩子是其他人。 – syntonym

回答

3

這是因爲與os.fork()要創建一個新的子進程。執行這兩個過程,現有的父母和新的孩子從os.fork()之後的行繼續。

孩子的PID在父親中可用作爲os.fork()的返回值,所以它執行if部分。

在兒童中,PID是0,這將導致部分else要執行,

兩種方法中,父和子,產生在其上顯示在終端的stdout輸出。

所以不是這樣的情況,ifelse語句在一個進程中執行;一個由父進程執行(當返回非零PID時),另一個由PID進程爲零時的子進程執行。

0

您有兩個進程:原始進程(父進程)和您使用fork創建的新進程,因爲兩個進程寫入相同的輸出,則會遇到輸出的干擾:父PRINT IF進程和其他PRNT在子進程中。 你可以通過爲每個進程分配不同的輸出(例如2個不同的文本文件)來解決這個問題

+0

感謝您的快速回復! – revit