1

私は理解できないように見えるので、数時間shmgetで問題を抱えています。呼び出しを行うたびにshmget()、常に EINVAL: "Invalid Argument" エラーが返されます。

コードの重要な部分は次のとおりです。

key_t generate_ipc_key()
{
    key_t ipc_key = ftok(__FILE__, KEY);
    if(ipc_key < 0) {
        perror("Failed to Generate IPC Key");
        exit(IPC_FAILURE);
    }

     return ipc_key;
}

int shared_memory_create(size_t memory_size)
{
    int shm_key = shmget(generate_ipc_key(), memory_size, IPC_CREAT | 0666);
    if(shm_key < 0) {
        perror("Failed to Create Shared Memory Key");
        exit(CREATE_FAILURE);
    }

    return shm_key;
}

関数は次のように呼び出されています:

shm_key = shared_memory_create(sizeof(data_t));

data_t は構造体です。

typedef struct {
    int hCount;
    int oCount;
    int bCount;
} data_t;

また、共有メモリの値は次のとおりです。

kernal.shmmax = 33554432
kernal.shmall = 2097152
kernal.shmmni = 4096

私はCにかなり慣れていないので、欠けているのは単純なものだと確信していますが、理解できないようです。どんな助けでも大歓迎です!

それが何であったか正確にはわかりません.ipcsは共有セグメントを表示しませんでした.再起動したところ、動作するようになりました.

4

1 に答える 1

2

マニュアルページには次のように書かれています。

EINVAL A new segment was to be created and size < SHMMIN or 
size > SHMMAX, or no new segment was to be created, a 
segment with given key existed, but size is greater than 
the size of that segment.

したがって、これらのいずれかが当てはまるかどうかを確認してください。ツールを実行して、ipcs既存の共有メモリセグメントを一覧表示し、プログラムがこれらのいずれかと衝突するかどうかを確認できます。共有メモリセグメントは、プロセスが終了した後も存続することに注意してください。

于 2013-03-14T01:14:41.193 に答える