簡體   English   中英

在C ++中使用fork()

[英]Working of fork() in C++

我用C ++編寫了這個程序。

#include <iostream>
#include <unistd.h>
#include  <sys/types.h>


using namespace std;

int main()
{
    cout<<"*\n";
    fork();
    cout<<"A\n";
    fork();
    cout<<"B\n";
    fork();
    cout<<"C\n";
    return 0;
}

輸出是:

*
A
B
C
*
A
B
C

我認為它應該是:

*
A
B
C
A
B
C
B
C
C

說明:'*'應由一個進程打印。 現在,在fork()之后fork() '應該打印,兒子用'B'和'C'。

鏈接到代碼

基於對該問題的評論,答案是ideone.com在線編譯器中的fork只是限制您進程的一個實例,並緩沖您的輸出。

更新 :實際上,它也在說謊: http//ideone.com/oXqqwM顯示fork()聲稱成功,但只有第一個產生了您的進程的新副本。

我懷疑你是否檢查了fork()的返回值,你會得到一些關於你所看到的令人驚訝的行為的線索 - 除了第一個將返回-1 - 如果你使用std::endl而不是你可能會避免第一個*

預期的結果是每個fork()在那個時刻復制正在運行的進程,因此你希望每個字符與前一個字符相比看到兩次,除了緩沖意味着你當時可能仍然有緩沖區中的前一個字符fork()

所以期望1或更多“*”,2或更多“A”,4或更多“B”或8或更多“C”,除非fork()失敗,數字將被限制。

你對1“*”,2“A”,3“B”和4“C”的期望表明你忽略了fork()中的兩個進程都會到達下一個fork() ,所以你加倍,而不是遞增一。

所以...如果你得到的不止一個*那么就會發生一些奇怪的事情,我懷疑它是特定於實現的...... fork會給每個子進程一個文件描述符的副本,包括stdout ..所以在你的實現中它也獲得了std :: cout流的有效副本......它已經有一個加載了*的緩沖區...

我想如果你改變你的程序以包含同花順,你會看到我做的同樣的事情:

#include <iostream>
#include <unistd.h>
#include  <sys/types.h>


using namespace std;

int main()
{
    cout<< "*\n";
    flush(cout);
    fork();
    cout<<"A\n";
    flush(cout);
    fork();
    cout<<"B\n";
    flush(cout);
    fork();
    cout<<"C\n";
    flush(cout);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM