2016-04-08 23 views
8
#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1; 
    fork(); 
    exit(0); 
} 

forkcout içine akış sonra bulunur, ancak bu kod baskılar 11. Neden? Ve std::endlcout'a eklendiğinde, kod yalnızca 1'i basıyor mu?Çatal() neden çoğaltılan çıktıyla sonuçlanır?

#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1 << std::endl; 
    fork(); 
    exit(0); 
} 
+8

Arabellekler iki işlemde iki kez temizlenir. Bu sinir bozucu olmalı. –

+1

Ne yazık ki, C++ nesneleri forking ile iyi oynamıyor. Temel olarak, nesne kopya oluşturmadan etkili bir şekilde kopyalanır ve bu da C++ tarafından çok fazla koruma sağlar. – SergeyA

+0

Sadece bir fork() 'ın standart konteynerlere zarar vereceğini hayal edebiliyorum. Sadece bunu yapma. –

cevap

12

Akış arabelleği nedeniyle oluşur. Akışın içine std::endl eklemek, akıtılmasına neden olur, böylece çatalladığınızda, akış tamponu boştur. std::endl'u eklemediğinizde, akış program çıkışına kadar temizlenmez. fork(), akışsız içerik dahil olmak üzere çıktı akışının çoğaltılmasına neden olur. fork()'dan sonra, '1' içeren akışsız çıkış arabellekleriyle 2 işlem vardır. Her biri çıkıp, tamponlarını temizler ve "11" görürsünüz.

İlgili konular