【问题标题】:Segmentation fault when using pipe使用管道时出现分段错误
【发布时间】: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; 
}

有什么想法吗?

【问题讨论】:

  • 您应该将&amp;w 传递给read;不是w
  • 那是怎么编译的?什么编译器默默地将结构实例转换为指针?我就是做不到。
  • 您可能希望始终打开所有警告(-Wall -Wextra -pedantic 用于 gcc),并修复您的代码,直到不再出现。

标签: c fork pipe ipc


【解决方案1】:

read() 第二个参数需要一个地址。 w的地址使用&运算符。

read(fd[0] , &w ,sizeof(struct s)) ;

【讨论】:

  • 好吧,还是同样的问题!
猜你喜欢
  • 2017-06-06
  • 2017-08-26
  • 2018-06-18
  • 2019-05-10
  • 2018-02-15
  • 2016-01-15
  • 2011-01-14
  • 2013-01-03
相关资源
最近更新 更多