2011-09-20 100 views
3

因此,我正在进入并发编程,但出于某种原因,我甚至无法使基本工作。我有一个名为fork.c的文件,它包含一个main方法。在这种方法中,主要我分叉两次,分成子进程1和2.如何在C中同时运行两个子进程?

在子1中,我打印字符'A'50次。

在孩子2中,我打印字符'B'50次。

当我运行我的代码时,我得到输出AAAAA ... AAAABBBBBB .... BBBBBB。但从来没有像ABABABABABABAB ....事实上,有时我甚至会得到BBBBB .... BBBBAAAA .... AAAAA。

那么,为什么我会遇到这种行为?也许我完全错了。

#include <stdlib.h> 
#include <stdio.h> 

void my_char(char n) { 
    write(1, &n, 1); 
} 

int main() { 
    int status; 
    pid_t child1, child2; 

    if (!(child1 = fork())) { 
     // first childi 
     int a; 
     for (a = 0; a < 50; a++) { 
      my_char('A'); 
     } 
     exit(0); 
    } else if (!(child2 = fork())) { 
     // second child 
     int a; 
     for (a = 0; a < 50; a++) { 
      my_char('B'); 
     } 
     exit(0); 
    } else { 
     // parent 
     wait(&child1); 
     wait(&child2); 
     my_char('\n'); 
    } 

    return 0; 
} 
+3

'fork'可能不是大多数人的想法当他们说“并发编程”... –

+0

这是为什么?对不起,这很新。 –

+0

'fork'创建一个新的单线程进程。 “并发”通常指单个进程内的多线程。 –

回答

7

他们同时运行,但进程启动后,几乎立即结束。换句话说,它们太短而不能真正重叠。

编辑:

启动另一个过程比它需要运行它们时不再需要的时间。因此重叠的机会很小。 (也有缓冲问题,我会省略)

您需要每个进程做更多的工作。尝试打印超过50份。打印超过10000份可能就足够了。

+0

完美。 [证明](http://ideone.com/msGZE)。非常感谢。我担心我不知道叉子是如何工作的。 –

+1

或者你可以在循环内调用一些睡眠。尝试[usleep](http://pubs.opengroup.org/onlinepubs/7908799/xsh/usleep.html)或[Sleep](http://msdn.microsoft.com/en-us/library/ms686298%28v= VS.85%29.aspx)根据您的操作系统/编译器。 –

3

我觉得这是很容易弄清楚fork()的工作原理是:

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    pid_t child1, child2; 
    printf("Start\n"); 
    if (!(child1 = fork())) { 
     // first childi 
     printf("\tChild 1\n"); 
     sleep(5); 
     exit(0); 
    } else if (!(child2 = fork())) { 
     // second child 
     printf("\tChild 2\n"); 
     sleep(5); 
     exit(0); 
    } else { 
     // parent 
     printf("Parent\n"); 
     wait(&child1); 
      printf("got exit status from child 1\n"); 
     wait(&child2); 
      printf("got exit status from child 2\n"); 
    } 

    return 0; 
} 

...这里是输出:

Start 
     Child 1 
    Parent 
     Child 2 
    got exit status from child 1 
    got exit status from child 1 
相关问题