2015-02-05 23 views
1

因此,我一直在尝试理解fork,虽然我理解基本知识(即,另一个进程是通过原始副本创建的数据当我们使用fork()时),我无法真正掌握这些创建的流程。如何利用每个进程在C中使用两个fork()时使用C

例如:我必须编写一个程序,该程序将调用fork()两次,共创建4个进程。当创建一个进程时,我必须用getpid()打印出pid。在打印出四个ID之后,我的程序应该打印一个字母10次。例如,家长1将打印'A',孩子1将打印'B',孩子2将打印'C',并且其父母将打印'D'。为此,我必须使用putchar(ch);并使用fflush(stdout)来刷新输出。

这意味着输出将是这样的:

Process created, ID: 3856 
Process created, ID: 3857 
Process created, ID: 3858 
Process created, ID: 3859 
AAAAAABBBBBBBCDCDCDCDCDCDCBBBDCDCAAAADCD 

到目前为止,我已经收到了四道工序,使用此代码打印:

int main(void) { 
    pid_t child1, child2; 
    child1 = fork(); 
    child2 = fork(); 
    printf("Process created. ID: %d\n", getpid()); 
} 

但我不知道如何使用wait()将所有内容随机打印出来,然后打印完ID。

为了获得我需要打印出来的一切,使其成为一个“随机混乱”,我该怎么办?我应该调用这样的函数吗?

// in main 
for(int i = 0; i < 10; ++i) { 
    char_parent1(); 
    char_child1(); 
    char_parent2(); 
    char_child2(); 
} 
return 0; 
} 

void char_parent1() 
{ 
    putchar('A'); 
    fflush(stdout); 
} 

void char_child1() 
{ 
    putchar('B'); 
    fflush(stdout); 
} 

// and so on for char_parent2() and char_child2() 

在这种情况下,如果我的教授说我必须基本打印出来的东西同时,随机,那么我为什么要使用wait()

+0

那么你在哪里打印字符?发布代码 –

+0

阅读[高级Linux编程](http://advancedlinuxprogramming.com/),它有几个章节来回答你的问题。 –

+0

@simon_xia我添加了一个我认为我应该做的例子..可能。 – Alex

回答

2

每个进程都需要知道应该打印哪个字母。这意味着您必须分析child1child2中的值。例如,一个进程有两个零;它可能会打印D

可以说,每个过程需要知道它是否是父母。如果它不是父母,它可以在打印10封信件后简单地退出,每封信件后面跟着一个fflush()。如果是父母,在等待孩子死后应该退出。这意味着原始进程将最后退出。在最后一个孩子死后可以输出一个换行符。你可能会也可能不会打印关于死去的孩子的诊断信息。

+0

谢谢你的帮助。我接受了你的建议,并让它工作:) – Alex

相关问题