簡體   English   中英

矩陣的共享 memory 的 Shmget 錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM