-1

フォークで飛び込んだプロセスがあります。各プロセスの計算結果用のメモリ領域 (行列) を作成する必要があります。これどうやってするの?私が試したものすべて、または使用できますが、プロセス間で共有されていないか、使用できません(共有されているかどうかはわかりません)。誰かが私が何を使うことができるか知っていますか? シンプルでセキュリティのないものにすることができます。シンプルなほど良い。試してみましたが、共有されておらず、正しく割り当てまたは使用するshmget方法がわかりませんでした。mmap私は他の疎遠なことを試しましたが、何もしませんでした。任意のヒント?

いくつかの試み:

segment_id = shmget(IPC_PRIVATE, (sizeof(int) * linhas_mat1 * colunas_mat2) ,  S_IRUSR|S_IWUSR);
matriz_result = (int **) shmat(segment_id, NULL, 0);

フォークはその後。各プロセスは、matriz_result通常はマトリックスとして使用できますが、メモリは共有されません。それぞれがローカル変数のようなものを持っています。

segment_id = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
matriz_result = mmap(NULL, (sizeof(int) * linhas_mat1 * colunas_mat2), PROT_READ | PROT_WRITE, MAP_SHARED, segment_id, 0);

mmapでこれを試しましたが、正しいかどうかわかりません。私はそのような低レベルのプログラミングが苦手で、正しく使用する方法の良い例を見つけることができませんでした.

宣言:

int segment_id is;
int **matriz_result;
4

1 に答える 1

2
int createMemShare(){
    //File descriptor declaration: 
    int fd;
    //We want to open the file with readwrite,create it, and empty it if it exists
    //We want the user to have permission to read and write from it
    fd = open(MEMSHARENAME, O_RDWR| O_CREAT | O_TRUNC, S_IRUSR| S_IWUSR );
    if(fd <= 0){
         puts("Failed in creating memory share .");
         return -1;
    }
    //Move the file pointer and write an empty byte, this forces the file to
    //be of the size we want it to be.
    if (lseek(fd, MEMSHARESIZE - 1, SEEK_SET) == -1) {
         puts("Failed to expand the memory share to the correct size.");
    return -1;
    }
    //Write out 1 byte as said in previous comment
    write(fd, "", 1);

    //Memory share is now set to use, send it back.
    return fd;
}

//Later on...
int memShareFD = mmap(NULL, MEMSHARESIZE, PROT_READ, MAP_SHARED, fd, 0);

//And to sync up data between the processes using it:
//The 0 will invalidate all memory so everything will be checked
msync(memshareFD,0,MS_SYNC|MS_INVALIDATE);

上記の機能を試して、共有メモリ空間を作成できます。基本的に必要なのは、作成したファイルを他のファイルと同じように扱うことだけです。man ページのコード例は非常に完成度が高く、一見の価値があります:ここで確認してください。

編集: Jens Gustedtがコメントで提案したように、おそらくshm_openを使用したほうがよいでしょう。上で書いた関数を使って自分でファイルを作るよりも使いやすくて簡単です。

于 2013-05-07T15:27:53.663 に答える