2017-05-12 25 views
0

名前付きセマフォと共有メモリで作業していますが、このコードがセグメンテーションフォルトをもたらす理由を教えてください。 これは、 のライターコードを実装しようとしているコードです名前付きセマフォと共有メモリを使用している読者とライターの問題なぜこのコードがセグメンテーションフォルトを与えるのか知る必要がありますか?なぜこのコードがセグメンテーションフォルトを与えるのですか?

#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <semaphore.h> 
#include <stdio.h> 
#define MAX 20              
int main (int argc, char** argv) 
{ 
    int fd; 
    sem_t *db; 
    int writtenData=0; 
    int *addr=NULL; 
    pid_t pid = getpid(); 
    printf("hi\n"); 
    fd = shm_open("/mymem",O_CREAT|O_RDWR, S_IRUSR | S_IWUSR); //segmentation fault here 
    printf("by\n"); 
    ftruncate(fd,sizeof(int)); 
    if(fd==-1) 
     printf("inja\n"); 
    db = sem_open("db",O_CREAT,0,1); 
    addr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
    *(addr)= 0; 


    //write db toshared memory 
    //* 
    //* 

    while (writtenData<=MAX) 
    { 
     sem_wait(db); 
     printf("The Writter acquires the clock\n"); 
     writtenData= *(addr); 
     printf("The writer %d writes the value %d\n",pid,writtenData); 
     writtenData++; 
     *(addr)= writtenData; 
     printf("The Writter release the Lock \n"); 
     sem_post(db); 
    } 


} 

答えて

0

プログラムは、2回目以降の呼び出しでクラッシュし、それが起こったと思われる場所ではクラッシュしません。

これ:

db = sem_open("db",O_CREAT,0,1); 

権限000の(誰のために、すなわちアクセスなし)名前付きセマフォを作成します。そのセマフォが存在しない場合(最初の実行時)、この呼び出しは成功します。それは(目以降の実行)が存在しない場合、この呼び出しはPermission deniedで失敗し、ここで結果を使用するあなたの試み:セグメンテーションフォールトで

sem_wait(db); 

クラッシュを。

レッスン:

  1. が知っている(というよりも、誤って推測)するためにデバッガを使用することを学ぶコードがクラッシュする
  2. 常にエラーのシステム機能をチェックします。
  3. manページをよく読んで、あなたが指定した引数が意味をなさないことを確認してください。
関連する問題