1

私は共有メモリを理解しようとしていて、消費者と生産者を含む簡単なプログラムを書こうとしました。私は消費者の部分にたどり着きませんでしたが、この奇妙な小さな問題を見つけました.親は*spool=3;韻や理由なしで戻ってきます. 何もありませんdmesg

#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define PRODUCER_ERROR(msg)         \
    do {perror("Producer Error: " msg "\n"); exit(1); }while(0)

#define SHM_NAME "/my_sharedmem"

void producer();

int main(int argc, char *argv[])
{
    pid_t pID = fork();
    if (pID == 0) {
    // Code only executed by child process
    printf ("Son here\n");
    return 0;
    } else if (pID < 0) {
    perror("Unable to fork\n");
    exit(1);
    } else {
    // Code only executed by parent process
    printf ("Parent here\n");
        producer();
    return 0;
    }

    return 0;
}


void producer()
{
    int fd, d;
    unsigned* spool;

    printf("<<Producer>> started\n");
    fd = shm_open(SHM_NAME, O_CREAT | O_RDWR,  S_IRWXU | S_IRWXG | S_IRWXO ); // FIXED

    printf ("<<Producer>> memory file opened\n");

    spool = mmap(NULL, sizeof(unsigned), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, fd, 0);
    printf ("<<Producer>> mmaped to %p\n\tGonna write.\n", spool);
    perror(NULL);

    *spool = 3;
    // msync(spool, sizeof(unsigned), MS_SYNC | MS_INVALIDATE);

    printf("<<Producer>> ended\n");
}

編集: shm_open モード引数を修正

4

2 に答える 2

3

shm_open で取得するオブジェクトのサイズはゼロです。そのためのスペースを割り当てる必要があります。mmap を使用すると、サイズを超えたもの (shm オブジェクトとファイルの両方) をマップできますが、そのメモリにアクセスするとクラッシュします。

shm_open の後の次のような処理が目的です。

ftruncate(fd, <the size you want>);

ボートが浮かんでいる場合は、mmap の後で行うこともできます。

于 2012-10-16T15:18:32.887 に答える
1

モード引数がshm_open間違っています。については、これはモード指定のはずですopen。おそらくあなたのバージョンでは偶然にもアドレスへの書き込みが禁止されているため、書き込みを試みるとプロセスがクラッシュします。

ところで: や などのライブラリ呼び出しの戻り値を常に確認する必要がshm_openありmmapます。

編集:以下のコメントでも見たように、セグメントを適切なサイズにスケーリングすることもできませんftruncate.

于 2012-10-16T14:14:33.800 に答える