0

このCコードが「セグメンテーション違反」で終わる理由を知っていますか?

#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>


#define NAMESEM "/mysem"

int main(int argc, char* argv) {
 sem_t* sem;
 int fd = shm_open(NAMESEM, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0);

 ftruncate(fd, sizeof(sem_t));

 sem = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

 sem_init(sem, 1, 0);

 sem_wait(sem);

 return 0;
}

これに関してここで見つかったすべての投稿をフォローしましたが、sem_init()がセグメンテーション違反を生成しているようで、その理由はわかりません。ポインタを間違えていませんか?

4

1 に答える 1

5

shm_openこの行で渡されるフラグについて考えてみます。

int fd = shm_open(NAMESEM, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0);
                                  ^^^^^^^^^^^^^^

NAMESEMこれは、存在しない場合に初めて機能することを意味します。のせいで、後続shm_opensは失敗しO_EXCLます。これは順番に意味ftruncateし、mmap失敗します。問題の要点は、これらのIPCオブジェクトは、プログラムが終了した後、明示的に削除されるまで、またはシステムが再起動されるまで存続することです。

O_EXCL

O_CREATも指定されていて、指定された名前の共有メモリオブジェクトがすでに存在する場合は、エラーを返します。

しかし、実際のコードの本当の問題は、これらの関数の戻り値をチェックしていないことです。単純なperrorものはすぐに問題を指摘します。

于 2013-02-03T13:53:38.180 に答える