POSIX IPC共享内存(需要帮助)

时间:2014-05-20 18:42:18

标签: c++ posix ipc shared-memory

你是这个论坛的新手, 我想询问如何制作 以下代码中的共享内存使用 shmat(),shmget(),路径mata,matb,matc 从父到子进程,因为我尝试使用全局 变量,但当子进程终止时,似乎 没有更新全局变量

请给我一个示例或示例代码... thnx inadvance

日Thnx

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;

class MATRIX{
public:
    int row;
    int col;
    int** MAT;
    MATRIX(int row , int col);
    ~MATRIX();
};
MATRIX::MATRIX(int row_i , int col_i){
    row=row_i;
    col=col_i;
MAT=new int* [row];
int i;
for(i=0;i<=row-1;i++){
    MAT[i]=new int [col];
}
}
MATRIX::~MATRIX (){
    int i;
    for(i=0;i<=row-1;i++){
        delete MAT[i];
    }
    delete MAT ;
}

void init_mat(MATRIX& mat){
int temp=1;
for(int i =0 ; i<= mat.row -1 ;i++){
    for(int j=0;j<=mat.col-1;j++){
        mat.MAT[i][j]=temp++; //Any initialization
    }
}

}

void print_mat(MATRIX& mat){
for(int i =0 ; i<= mat.row -1 ;i++){
    for(int j=0;j<=mat.col-1;j++){
        cout<<mat.MAT[i][j]<<" ";
    }
    cout<<endl;
}
}
void mul_col(MATRIX& mata ,MATRIX& matb,MATRIX& matc, int col){
int sum;
    for (int j =0 ;j<= mata.row-1;j++){
        sum=0;
        for(int i= 0 ;i<=mata.col-1;i++){
            sum=sum+mata.MAT[j][i]*matb.MAT[i][col];
        }
        matc.MAT[j][col]=sum;
    }

}

    MATRIX mata(3,3);
    MATRIX matb(3,3);
    MATRIX matc(3,3);

int main()
{


    init_mat(mata);
    init_mat(matb);
     //print_mat(mata);
    //print_mat(matb);


  pid_t pid;

   for (int k=0; k <= (matb.col-1);k++){

    pid = fork();

    if(pid == 0){
            cout<<"am in mul place"<<endl;
            mul_col(mata,matb,matc,k);
            print_mat(matc);
            cout<<k<<endl;
            exit(0);
    }
    else if(pid > 0){
        wait(NULL);
        cout<<"i passed by the wait  "<<endl;

    }
    else{
        cout<<"Can't fork"<<endl;
    }

    if (pid == 0)
    {
    break;
    }

    }

    if(pid > 0){
    cout<<"am in the print area"<<endl;
    print_mat(matc);
    }


}

1 个答案:

答案 0 :(得分:0)

  1. 从(3)开始。关键是发现机制。它是两个独立进程可以找到并附加到同一共享内存的手段。只要每个人都知道相应文件的路径,他们就可以调用ftok,这将产生一个唯一的(大部分时间)&#34; key&#34;。然后shmget使用该密钥查找(或创建)它正在管理的内存段并返回ID。 ID是你真正关心的,因为它是段的句柄,并用于其余的相关共享内存调用。

  2. 通过(1)我认为,您正在询问有关&#34;相关的流程&#34;对彼此。换句话说,如果进程在父进程中打开共享内存然后分叉,则不需要再次遍历整个ftok/shmget样板。它将作为fork的一部分继承开放的共享内存段,并且它将在父项存储它的地方具有ID,因为子项作为父项的副本启动。

    如果两个流程分别启动,那么您必须同时执行shmget等。

  3. shmget的标志实际上是2个单独的集合或ORed在一起。 (a)IPC_CREAT和IPC_EXCL; (b)任何open电话共有的文件权限。常量通常在fcntl.h中找到 - 例如S_IRUSR,S_IWUSR,S_IXUSR等。所以类似:

    shmid = shmget(shmkey,sizeofsegment,0666 | IPC_CREAT | IPC_EXCL);

    shmid = shmget(shmkey,SIZEOFSHMSEG,IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); //等

  4. 注意:POSIX中有两种共享内存。这是&#34; sysv&#34;变种。还有&#34; posix&#34;使用不同调用和方法来实现类似效果的变体。