C 使用共享内存对2个2D数组进行乘法

C 使用共享内存对2个2D数组进行乘法,c,operating-system,shared-memory,C,Operating System,Shared Memory,我想用共享内存在C中乘以2个2D数组(C[I][j]=A[I][j]*B[I][j])。我必须在子进程中单独调用compute来计算每个乘法 A=lm矩阵和B=uv矩阵,所以我必须创建l*v子进程,其中我使用execv/execl调用compute。我得到一个分段错误(核心转储) 主要内容: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h>

我想用共享内存在C中乘以2个2D数组(C[I][j]=A[I][j]*B[I][j])。我必须在子进程中单独调用compute来计算每个乘法

A=lm矩阵和B=uv矩阵,所以我必须创建l*v子进程,其中我使用execv/execl调用compute。我得到一个分段错误(核心转储)

主要内容:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>

int main(int argc,char *argv[])
{
    FILE *fp;
    int **A;
    int **B;
    int **C;
    int l,m,u,v,size;
    int pid;

    int segment_id;
    int *shared_memory;
    int i,j,tmp;

    //---------------------------------------------
    //Reading arrays 
    fp=fopen("/home/ubuntu-gnome/Desktop/arrays.txt","r");
    fscanf(fp,"%d %d",&l,&m);   
    *A=(int *)malloc(l*sizeof(int));
    for(i=1;i<=l;i++){
    A[i]=(int *)malloc(m*sizeof(int));
    }
    for(i=1;i<=l;i++){
        for(j=1;j<=m;j++){
            fscanf(fp,"%d ",&tmp);
            A[i][j]=tmp;
        }
     }

    fscanf(fp,"%d %d",&u,&v);   
    *B=(int *)malloc(u*sizeof(int));
     for(i=1;i<=u;i++){
     B[i]=(int *)malloc(v*sizeof(int));
   }
   for(i=1;i<=u;i++){
        for(j=1;j<=v;j++){
            fscanf(fp,"%d",&tmp);
            B[i][j]=tmp;
        }
    }
    fclose(fp);

 //------------------------------------------------------------------
 //printing arrays 
      for(i=1;i<=l;i++){
           for(j=1;j<=m;j++){
               printf("%d  ",A[i][j]);
        }
         printf("\n");
    }
    printf("\n*3");
    for(i=1;i<=u;i++){
         for(j=1;j<=v;j++){
              printf("%d" ,B[i][j]);
        }
        printf("\n");
     }

//---------------------------------------------------------------
//Shared Memory 
    size=sizeof(int)*l*m*u*v*l*v;
    segment_id = shmget(IPC_PRIVATE,size,S_IRUSR|S_IWUSR);
    shared_memory=(int *)shmat(segment_id,NULL,0);
    for(i=1;i<=l;i++)
         for(j=1;j<=m;j++)
             shared_memory[i*j+j]=A[i][j];

    for(i=(l+1);i<=(u+l);i++)
         for(j=(1+m);j<=(v+m);j++)
             shared_memory[i*j+j]=B[i][j];

  //-------------------------------------------------------------------
  // Multiplication error beacuse column of A!= row of B 
    if (u!=m){
         printf("\nMultiplication error !\n");
         exit(1);
    }

//------------------------------------------------------------------
    for (i=1;i<=l;i++){
        for (j=1;j<=v;j++){

            pid=fork();
            if(pid>=0){//fork was successful
                if (pid==0){//child proccess
                    execl("/home/ubuntu-gnome/Desktop/compute","compute", (char)segment_id,(char)size,(char)i,(char)j,(char)m,(char)l,(char)v,NULL);
                }
                else //parent proccess
                    wait(0);
                }
            else // fork failed
            {
                     printf("\n Fork failed, quitting!!!!!!\n");
                     return 1;
            }
        }
     }
  //-------------------------------------------------
  //filing C 
    *C=(int *)malloc(l*sizeof(int));
     for(i=1;i<=l;i++){
           C[i]=(int *)malloc(v*sizeof(int));
      }
     for(i=1;i<=l;i++){
          for(j=1;j<=v;j++){
               B[i][j]=shared_memory[m*(l*v)+i];
          }
     }


//-------------------------------------------------
//printing C=A*B
    for(i=1;i<=l;i++){
        for(j=1;j<=v;j++){
            printf("%d  ",C[i][j]);
        }
        printf("\n");
    }
    /* now detach the shared memory segment */
    shmdt(shared_memory);
    /* now remove the shared memory segment */
    shmctl(segment_id, IPC_RMID, NULL);

    return 0;
}

compute: 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>

int main(int argc,char *argv[])
{
    int segment_id;
    int *shared_memory;
    int key =atoi(argv[0]);
    int size =atoi(argv[1]);
    int row=atoi(argv[2]);
    int col=atoi(argv[3]);
    int m=atoi(argv[4]);
    int l=atoi(argv[5]);
    int v=atoi(argv[6]);
    int i,j,Mul;

    shared_memory=(int *)shmat(segment_id,NULL,0);

    for (i=row;i<=m;i++){
        for (j=col;j<=m;j++){

            Mul=Mul+shared_memory[i]*shared_memory[l*m+j];
            }
            shared_memory[m*(l*v)+i]=Mul;
        Mul=0;
    }

    return 0;
}  

arrays.txt :
6 2 
2 4
4 8
1 0
3 12
7 2
8 9
2 4
2 4 3 12
6 7 8 5
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*fp;
国际**A;
国际**B;
int**C;
整数l,m,u,v,大小;
int-pid;
int段_id;
int*共享内存;
int i,j,tmp;
//---------------------------------------------
//读取阵列
fp=fopen(“/home/ubuntugnome/Desktop/arrays.txt”,“r”);
fscanf(fp、%d%d、&l和&m);
*A=(int*)malloc(l*sizeof(int));

对于(i=1;iAFAIK),它应该是这样的

int **A = (int **)malloc(l * sizeof(int *));
    for (i=0; i<l; i++)
         A[i] = (int *)malloc(m * sizeof(int));
int**A=(int**)malloc(l*sizeof(int*);

对于(i=0;i租入
c
——我在这个论坛上看到的不是
c++
Iskar Jarak,因为它是2D matrixIt,无论你是分配给
int*
还是
int**
-
malloc(),都不重要<代码> >返回代码>空白>代码>,这将隐含地匹配你分配给它的任何东西。你可能一直在看C++问题,你应该在哪里投下结果,因为C++不是C。请在旧代码< C >代码>。NewCoder,在编译过程中,我会发现错误。
for(i=0;i<l;i++){
        for(j=0;j<m;j++){
            fscanf(fp,"%d ",&tmp);
            A[i][j]=tmp;
        }
}