2016-09-17 28 views
1

我想了解c中的fork是如何工作的。我试图解决的问题是;给定f(上),我试图找到f(1)+ f(2)+ .. f(上)。 我想做多进程编程来让fork每个子进程并让每个子进程计算f(x)。因此,f(1),f(2)... f(upper)是由每个子进程计算出来的。创建多于6个子进程的共享内存出错

父进程应计算以下f(1)+ .. + f(上)。 这里是我的代码

#include <sys/types.h> 
#include <stdio.h> 
#include <unistd.h> 
#include<sys/shm.h> 
#include<sys/ipc.h> 

int upper = 0; 
int n = 0; 

int main(int argc, char*argv[]){ 
    pid_t pid; 
    if(argc != 2){ 
     printf("Input one argument"); 
     return -1; 
    } 
    upper = atoi(argv[1]); 


    int segment_id; 
    int *s; 
    pid_t *pids; 
    pids = (pid_t *) malloc(sizeof(int) * upper); 
    s = (int *) malloc(sizeof(int) * upper); 


    key_t key = 4141; 
    if((segment_id = shmget(key, upper * sizeof(int), IPC_CREAT | 0667))< 0) perror("shmget: failure"); 

    if((s = shmat(segment_id, NULL, 0)) == (char *) -1){ 
     perror("shmat : failure"); 
     exit(1); 
    } 
    for(int i = 1; i <= upper; i++){ 
     pid = fork(); 
     if(pid == 0) { 
     n = i; 
     break; 
     } 
     pids[i] = pid; 
    } 

    if(pid > 0){ 
     wait(1 * upper); 
     int totalSum; 
     for(int i = 0; i < upper; i++){ 
     totalSum += s[i]; 
     } 
    printf("Total sum = %d", totalSum); 


} else { 
    sleep(2); 
    int sum = 0; 
    for(int i = 0; i <= n; i++){ 
    sum += i; 
    } 
    s[n - 1] = sum; 
    printf("n => %d : sum %d\n", n, sum); 

} 
} 

但是每当我试图用参数运行这个程序超过6 我收到无效的参数错误。

+0

有什么想法背后的'等待(1 *上);',好吗? – alk

回答

2

你正在写的pids的范围之外

pids = (pid_t *) malloc(sizeof(int) * upper); 
... 
for(int i = 1; i <= upper; i++){ 
    pid = fork(); 
    if(pid == 0) { 
    n = i; 
    break; 
    } 
    pids[i] = pid; /* Here */ 
} 

更改为

for(int i = 1; i < upper; i++){