在C ++中使用fork()

时间:2016-02-04 03:52:52

标签: c++ fork

我在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

说明:&#39; *&#39;应该通过一个过程打印。现在,在fork() 2&#39; A&#39;应该打印和儿子为&#39; B&#39; &安培; &#39; C&#39;

Link to code

2 个答案:

答案 0 :(得分:1)

基于对该问题的评论,答案是ideone.com在线编译器中的$.validator.addMethod("3greater4", function(value, element) { return $('#4').val() > $('#3').val() }, "* 3 should be greater than or equal to 4."); $('form').validate({ rules: { title: { required: true, minlength: 10 }, 3: { required: true, number: true,, 3greater4 : true }, 4: { required: true, // only if radio 2 is checked. number: true,, 3greater4 : false } } }); 只是限制您进程的一个实例,并缓冲您的输出。

更新:实际上,它也在撒谎:http://ideone.com/oXqqwM表示fork声称成功,但只有第一个会生成您的流程的新副本。

我怀疑你是否检查了fork()的返回值,你会得到一些关于你所看到的令人惊讶的行为的线索 - 除了第一个将返回-1之外 - 如果你使用了{ {1}}而您可能避免使用第一个fork()

预期的结果是每个std::endl在那一刻复制正在运行的进程,因此您希望每个字符与之前的字符相比看到两次,除了缓冲意味着您可能仍然有以前的字符*时的缓冲区。

所以期望1个或更多“*”,2个或更多“A”,4个或更多“B”或8个或更多“C”,除非fork()失败,数字将被限制。< / p>

您对1“*”,2“A”,3“B”和4“C”的期望表示您忽略了来自fork()两个进程将会命中下一个fork(),所以你加倍,而不是递增一个。

答案 1 :(得分:0)

所以......如果你得到的不止一个*那么就会发生一些奇怪的事情,我怀疑它是特定于实现的...... 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;
}