2

-1次のコードは、共有メモリを作成するために常に返されます。その理由はわかりません。私の知る限り、私のコードは正しいです。Perror returns not such file or directory。何を指しているのかわかりませんが、このファイルとヘッダーは同じディレクトリにあります。コードは次のとおりです。

#include "MyShared.h"


int main()
{
struct MyShared *obj;

int shmid,i,childpid;

shmid=shmget(MySharedKey,sizeof(struct MyShared),PERM);
if(shmid==-1)
    printf("Failed to create shared mem\n");
obj=(struct MyShared*)shmat(shmid,NULL,0);

obj->ReadFromBuf=0;
....
}

これがヘッダーファイルです。My Shared.h

#ifndef MYSHARED_H_INCLUDED
#define MYSHARED_H_INCLUDED

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>


#define PERM (S_IRWXU | S_IRGRP)
#define MySharedKey 564732
#define SIZE 512  // 512 bytes

struct MyShared
{
    char buf[SIZE];

    int ReadFromBuf,WriteToBuf,readbytes;
};

#endif

このコードで共有メモリを作成できないのはなぜですか?

私はubuntu10.04を使用しています。

私はフォローUnix System programming by Stevensしていますが、共有メモリの作成権限については何も述べていません。

よろしく

4

2 に答える 2

3

それ以外の

printf("Failed to create shared mem\n");

より良い使用

perror("Failed to create shared mem");

これにより、変数が評価され、errnoより有用なエラーメッセージが出力されます。

Failed to create shared mem: No such file or directory

その理由は、存在しないメモリセグメントに接続しようとしているためです。

共有メモリセグメントを作成IPC_CREATするには、フラグをshmget()次の場所に渡す必要があります。

shmid=shmget(MySharedKey,sizeof(struct MyShared),PERM | IPC_CREAT);

http://www.kernel.org/doc/man-pages/online/pages/man2/shmget.2.htmlも参照してください。

このフラグを渡していない場合は、共有メモリセグメントがすでに存在し、プロセスがそれに接続しようとしていると見なされます。これは、共有メモリセグメントがマスタープロセスによって作成された後、共有メモリセグメントにアクセスするスレーブプロセスによって実行される必要があることです。

于 2012-12-25T14:00:30.773 に答える
0

まず、ヘッドファイルが失われます。

#include <sys/types.h>  
#include <sys/ipc.h>
#include <sys/shm.h>

shmget()次に、関数の最初の引数は型です。したがって、キーを生成するには関数を key_t使用する必要があります。fotk()

例:
Myshared.h

#ifndef _MYSHARED_H
#define _MYSHARED_H

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define FLAG (IPC_CREATE | IPC_EXCL)
#define SIZE 512

typedef struct {
        char buf[SIZE];
        int read_from_buffer, write_to_buffer, read_bytes;
} Shared;

#endif

Myshared.c

#include "Myshared.h"
#include <stdio.h>

int main(int argc, char **argv)
{
        key_t key; 
        int shmid;

        key = ftok("/dev/null", 0);  # /dev/null just a example
        shmid = shmget(key, sizeof(struct Shared), FLAG);
        if (shmid == -1) {
                perror("Create Shared Memory Error:");
        }
        ......
}

最後に、入力して自分自身を助けることができman ftokますman shmget

于 2012-12-25T15:35:24.197 に答える