【问题标题】:POSIX IPC Shared memory (need help)POSIX IPC 共享内存(需要帮助)
【发布时间】:2014-05-20 18:42:17
【问题描述】:

您好,我是这个论坛的新手, 我想问一下怎么做 以下代码中的共享内存使用 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);
    }


}

【问题讨论】:

  • 仅仅复制别人的代码对你没有多大帮助。你必须学习这些东西。你可以开始here
  • 如果有一些代码解释会很有帮助..但是谢谢你的帮助..我会阅读那个页面
  • 阅读、吸收并尝试一下。人们愿意在此过程中帮助您解决特定问题,但 SO 不是教程服务。
  • 我已经阅读了该页面并理解了其中的大部分内容,但是即使在搜索 google 后我也无法得到一些要点,1)我是否仍然需要将内存附加到创建共享内存的进程使用 shmget() 或 shmget 完成这两项工作,2)我找不到包含标志常量列表及其相应功能的文档,key 的解释(含义)是什么,4)key 之间有什么区别和内存 id ...thnx

标签: c++ posix ipc shared-memory


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

  2. 对于 (1) 我认为,您是在询问彼此“相关”的过程。换句话说,如果一个进程在父进程中打开共享内存然后分叉它不需要再次遍历整个ftok/shmget 样板。它将作为分叉的一部分继承开放的共享内存段,并且无论父级存储它的任何位置都将具有 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); //等等

注意:POSIX 中有两种共享内存。这是“sysv”变体。还有一个“posix”变体,它使用不同的调用和方法来实现类似的效果。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2020-10-18
    • 2011-04-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多