2016-02-28 79 views
0

我在共享内存中获得了一个带有n个柱的整数矩阵,所以我创建了n个进程,每个进程创建一个柱的总和。问题是它们不能并行执行。还有就是代码(这实际上并没有做的总和,是测试):fork()创建的进程不会并行执行

int pid2[n]; 
    i=0; 
    do{ 
     pid2[i] = fork(); 
     if(pid2[i]==-1) printf("fork() fail!\n"); 
     else if(pid2[i]==0){ 
     printf("Start process %d \n", i); 
     sleep((rand() % 50)/10); 
     printf("Process %d terminated" ,i); 
     }   
     else i++; 
     } 
    while(i<n&&pid2[i]>0); 

什么,我得到的是,它在这个订单处理3,2,1运行,并以相同的顺序结束时,总是。但睡眠是随机的,所以到达时间应该是随机的!另外,我不明白为什么它从进程3开始。

回答

2

你的代码是错误的,不这样做你的想法。

fork()成功的情况下,调用者递增i,然后while的最终测试为false,因此原始进程终止。当新进程执行代码“start 0”,“terminate 0”时,然后跳转到真正的测试,然后再次分叉等等。所以你的进程总是以相同的顺序一个接一个地产生。

以下是更正代码(随机种子):

int pid2[n]; 
i=0; 
do{ 
    pid2[i] = fork(); 
    if(pid2[i]==-1) printf("fork() fail!\n"); 
    else if(pid2[i]==0){ 
    printf("Start process %d \n", i); 
    sleep((rand() % 50)/10); 
    printf("Process %d terminated" ,i); 
    exit(0); // ends the child 
    }   
    else i++; 
    } 
while(i<n&&pid2[i-1]>0); // test is last pid is correct 
+0

父'仍然执行'while(我 0)''后'我'增加了这是错误的。 'pid [i]'在这一点上还没有初始化。 –

+0

是的,我忘记纠正代码中的那一点...完成。 –

1

当您没有使用srandom函数种子随机数生成器时,您将始终获得相同序列的“随机”数字。通常你会拨打srandom(time(NULL))

检查这个简单的程序:

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

int main(void) { 
    printf("%d\n", rand()); 
    return 0; 
} 

在我的电脑总是输出1804289383

此外,当您在您的孩子的过程称之为rand总是继承随机数生成机器的父母的状态,让您的孩子将永远产生相同随机数。在分叉之前你应该产生这个随机数。在下面的代码的所有儿童返回相同的随机值:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

#define CHILDREN 3 

int main(void) { 
    int i; 
    for (i = 0; i < CHILDREN; ++i) { 
     if (fork() == 0) { 
      printf("rand is %d in child %d\n", rand(), i); 
      return 0; 
     } 
     wait(NULL); 
    } 

    return 0; 
} 

最后一件事是,创造一些工艺单后,另一个并不意味着他们将得到的处理器时间的顺序。当你的第一个孩子fork完全没问题时,处理器的上下文将返回给父母,他将执行另一个fork,然后处理器的上下文将被分配给第二个孩子,而不是第一个孩子。

的作品

代码:

#include <time.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

#define CHILDREN 3 
int main(void) { 
    int pid, i, children = 0; 
    srand(time(NULL)); 
    double sleeptime; 
    for (i = 0; i < CHILDREN; ++i) { 
     sleeptime = (rand() % 50)/10.0; 
     pid = fork(); 
     if (pid == -1) { 
      perror("fork failed"); 
     } else if (pid == 0) { 
      printf("Child %d crated\n", i); 
      fflush(stdout); 
      sleep(sleeptime); 
      printf("Child %d terminated\n", i); 
      fflush(stdout); 
      return 0; 
     } else { 
      ++children; 
     } 
    } 

    // wait for all childredn 
    for (i = 0; i < children; ++i) { 
     wait(NULL); 
    } 

    return 0; 
} 
+0

我用srandom,仍然得到同样的数量。仍然我没有得到它为什么从过程3开始,而不是1. – alteration

+0

@alteration:扩展我的答案 – nsilent22