你是这个论坛的新手, 我想询问如何制作 以下代码中的共享内存使用 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);
}
}
答案 0 :(得分:0)
从(3)开始。关键是发现机制。它是两个独立进程可以找到并附加到同一共享内存的手段。只要每个人都知道相应文件的路径,他们就可以调用ftok
,这将产生一个唯一的(大部分时间)&#34; key&#34;。然后shmget
使用该密钥查找(或创建)它正在管理的内存段并返回ID。 ID是你真正关心的,因为它是段的句柄,并用于其余的相关共享内存调用。
通过(1)我认为,您正在询问有关&#34;相关的流程&#34;对彼此。换句话说,如果进程在父进程中打开共享内存然后分叉,则不需要再次遍历整个ftok/shmget
样板。它将作为fork的一部分继承开放的共享内存段,并且它将在父项存储它的地方具有ID,因为子项作为父项的副本启动。
如果两个流程分别启动,那么您必须同时执行shmget
等。
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中有两种共享内存。这是&#34; sysv&#34;变种。还有&#34; posix&#34;使用不同调用和方法来实现类似效果的变体。