[英]Shmget error for shared memory of a matrix
代碼上下文:您好,我正在嘗試創建一個程序,該程序可以使用單獨的進程(child1 和 child2)將兩個 2x2 矩陣相乘。 具體來說,child1 處理結果矩陣的第 1 行,而 child2 處理結果矩陣的第 2 行。 該結果矩陣存儲在共享 memory 中。
問題: shmget()返回 -1,而errno是 22 = 無效參數。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <stdbool.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "shm_com.h"
//signal handler should be void of return type
void sig_handler(int signo){
printf("Inside handler function\n");
}
int main(){
int PROCESS_COUNT = 0;
bool display = false;
int row, column, limit=2;
int M[2][2] = { {20, 20},
{10, 6}};
int N[2][2] = { {10, 30},
{1, 3}};
int Matrix_Size1=sizeof(M)/sizeof(int);
int Matrix_Size2=sizeof(N)/sizeof(int);
if(Matrix_Size1==Matrix_Size2) printf("Matrixes are the same size\n");
int shmid;
void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
//shmid = shmget((key_t)9998, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
shmid = shmget((key_t)9998, sizeof(int * 3 * (2*2)), 0666 | IPC_CREAT);
//Creation of Shared Memory
if (shmid == -1) {
printf("Oh dear, something went wrong with shmget()! %d\n", errno);
exit(EXIT_FAILURE);
}
pid_t pid1,pid2;
pid1 = fork();
PROCESS_COUNT = 1;
if(pid1!=0){
pid2 = fork();
PROCESS_COUNT = 2;
}
//Warning code after this point will be included into child unless in if statement
if ((PROCESS_COUNT == 1 && pid1==0) || (PROCESS_COUNT == 2 && pid2 == 0)){
/* child1 ------------------------------------------------------------*/
if(PROCESS_COUNT == 1){
printf("Child 1 Process: working with Q's 1 row\n");
//sleep(10);
//Get access to shared memory
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
if(display){printf("Child Memory attached at %X\n", (int)shared_memory);}
shared_stuff = (struct shared_use_st *)shared_memory;
for(column=0; column<limit; column++){
for (row=0; row<limit; row++){
shared_stuff->Q_matrix[0][column] += M[0][column]*N[row][column];
printf("check %d ",shared_stuff->Q_matrix[0][column]);
//printf("check Row:%d,Column: %d ",row,column);
}
if(display){printf("Row1_Q_matrix \n");}
printf("\n");
}
//kill(pid1, SIGALRM);
exit(1);
}
/*-------------------------------------------------------------------*/
/* child2 */
else if(PROCESS_COUNT == 2){
printf("Child 2 Process: working with Q's 2 row\n");
//Get access to shared memory
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
if(display){printf("Child Memory attached at %X\n", (int)shared_memory);}
shared_stuff = (struct shared_use_st *)shared_memory;
}
} else {
/* parent ------------------------------------------------------------*/
if(display){printf("Parent pid: %i PROCESS_COUNT: %i \n ", getpid(),PROCESS_COUNT);}
//Get access to shared memory
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
if(display){printf("Parent Memory attached at %X\n", (int)shared_memory);}
shared_stuff = (struct shared_use_st *)shared_memory;
//Write number to shared memory------------------------------------------------*/
//Write and Display M matrix
for (row=0; row<limit; row++)
{
for(column=0; column<limit; column++){
shared_stuff->M_matrix[row][column] = M[row][column];
if(display){printf("%d ", (shared_stuff->M_matrix[row][column]));}
}
if(display){printf("M_matrix \n");}
printf("\n");
}
//Write and Display N matrix
for (row=0; row<limit; row++)
{
for(column=0; column<limit; column++){
shared_stuff->N_matrix[row][column] = N[row][column];
if(display){printf("%d ", (shared_stuff->N_matrix[row][column]));}
}
if(display){printf("N_matrix \n");}
printf("\n");
}
//Write and Display Q matric
printf("Written Matrix\n");
for (row=0; row<limit; row++)
{
for(column=0; column<limit; column++){
shared_stuff->Q_matrix[row][column] = 0;
printf("%d mem:%p \n", (shared_stuff->Q_matrix[row][column]),& (shared_stuff->Q_matrix[row][column]));
}
if(display){printf("Q_matrix");}
printf("\n");
}
wait(NULL);
sleep(10);
printf("Resulting Matrix2\n");
printf("%d Mem: %p \n", (shared_stuff->Q_matrix[0][0]),& shared_stuff->Q_matrix[0][0]);
printf("%d Mem:%p\n", (shared_stuff->Q_matrix[0][1]),& shared_stuff->Q_matrix[0][1]);
printf("%d Mem:%p\n", (shared_stuff->Q_matrix[1][0]),& shared_stuff->Q_matrix[1][0]);
printf("%d Mem:%p\n", (shared_stuff->Q_matrix[1][1]),& shared_stuff->Q_matrix[1][1]);
/*for (row=0; row<limit; row++){
for(column=0; column<limit; column++){
printf("%d mem:%p \n", (shared_stuff->Q_matrix[row][column]),& shared_stuff->Q_matrix[row][column]);
}
if(display){printf("Q_matrix");}
printf("\n");
}*/
exit(EXIT_SUCCESS);
printf("done\n");
}
}
這是我共享 memory 的結構:
#define TEXT_SZ 2048
struct shared_use_st {
int M_matrix[2][2];
int N_matrix[2][2];
int Q_matrix[2][2];
};
有人可以解釋我在shmget()上做錯了什么嗎?
需要注意的是,我已經注釋掉了shmget()的第一次嘗試。
進行一些清理,因為您可能有給定鍵的現有段,但大小不匹配。 您可能同時增加了結構。 在啟動程序之前執行ipcrm -M 9998
,因為手冊指定在以下情況下會引發EINVAL :
錯誤
[...]
EINVAL 將創建一個新段,其大小小於 SHMMIN 或大於 SHMMAX。
EINVAL 存在給定鍵的段,但大小大於該段的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.