2016-04-24 12 views
-1

if-else文を含む以下のコードがあります。私がそれを印刷すると、if部分が実行されてもelse部分が実行されたように見えます。私は猫-Aでそれを実行したとインデントが正常に見えるIF stmtがPythonで実行されたとしても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 

ところで、すべてのコードがループ内に存在します。

私は、この動作のための任意のアイデアに感謝

... os.fork()で新しい子プロセスを作成しているためだ

+0

ここではfork()を使用します。ですから、pid = 0(子)とpid = something(親)の2つのプロセスがあります。親はifブランチに入り、子はelseを入力します。 – syntonym

答えて

3

の実行のプロセスは、既存の親と新しい子の両方がos.fork()の行から続きます。

子のPIDは、戻り値としてos.fork()から親で利用できるので、if部分を実行します。子供で

、PIDは

両方のプロセス、親と子、あなたの端末に表示されている標準出力に出力を生成し、実行されるelse一部の原因となる0です。

だからない両方ifelseステートメントは、1つのプロセスで実行されている場合。 1つは親プロセス(ゼロ以外のPIDが返されたとき)によって実行され、もう1つはPIDがゼロのときに子プロセスによって実行されます。

0

2つのプロセスが同じ出力に書き込むので、元のもの(親)とforkで作成した新しいプロセスの2つのプロセスがあります。その場合、出力の干渉が発生します。親のPRINT IFプロセスおよびPRNTを子プロセスに追加します。 これは、プロセスごとに異なる出力(2つの異なるテキストファイルなど)を割り当てて修正できます。

+0

迅速な返信をありがとう! – revit

関連する問題