【发布时间】:2014-03-21 15:52:43
【问题描述】:
我正在做的分配要求并行使用 10 个进程对两个数组求和,所以我编写了这段代码,并且我使用管道到 IPC 之间的父级和它的子级,但它给了我分段错误,当它想要从管道中读取。
#include <stdlib.h>
#include<stdio.h>
struct s {
int * x ;
int max , min ;
} ;
void sum(int *a , int *b , struct s w , int min , int max , int pipe)
{
int i ;
for(i = min ; i < max ; i++)
{
*(w.x+i) = *(a+i)+*(b+i) ;
}
write(pipe , w , sizeof(w)) ;
}
int main()
{
int i ,min = 0 ,max = 1 ;
int a[11] = {1,1,1,10,1,1,1,1,1,1,1} ;
int b[11] = {1,1,1,10,1,1,1,1,1,1,1} ;
int c[11];
int fd[2] ;
int j ;
pipe(fd) ;
for(i = 0 ; i < 10 ; i++)
{
int pid = fork();
if(pid == 0)
{
struct s w ;
w.max = max ;
w.min = min ;
*w.x = c[0] ;
close(fd[0]) ;
sum(a,b,w,min , max , fd[1]);
printf("Done %d \n" , i);
exit(0);
}
else
{
min++;max++;
}
}
struct s w ;
for(j = 0 ; j < 10 ; j++)
{
//segmentation fault !!
read(fd[0] , w ,sizeof(struct s)) ;
for(i = w.min ; i < w.max ; i++)
{
printf("[%d] --> %d \n" ,i , *(w.x+i) ) ;
}
}
return 0;
}
有什么想法吗?
【问题讨论】:
-
您应该将
&w传递给read;不是w。 -
那是怎么编译的?什么编译器默默地将结构实例转换为指针?我就是做不到。
-
您可能希望始终打开所有警告(
-Wall -Wextra -pedantic用于 gcc),并修复您的代码,直到不再出现。