我有以下代码,其中包含if-else语句。当我打印它时,即使if部分也被执行,看起来似乎已经执行了else部分。我用cat -A运行它,缩进看起来很好
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 :(得分:3)
那是因为os.fork()
正在创建一个新的子进程。执行两个进程,现有父进程和新子进程,继续os.fork()
之后的行。
子项的PID在父项中可用作os.fork()
的返回值,因此它执行if
部分。
在子节点中,PID为0,导致else
部分被执行,
两个进程(父进程和子进程)都在stdout上生成输出,该输出显示在终端中。
所以不是两个 if
和else
语句都在一个进程中执行的情况;一个由父进程执行(当返回非零PID时),另一个由子进程在PID为零时执行。
答案 1 :(得分:0)
您有两个进程:原始进程(父进程)和使用fork创建的新进程,因为两个进程写入相同的输出,然后您将遇到输出的干扰:父进程中的PRINT IF和子进程中的PRNT。 你可以通过为每个进程归因不同的输出(例如2个不同的文本文件)来解决这个问题