2017-06-16 15 views
-4

フルプログラムで「セグメンテーションエラー」が発生した後、Linuxで共有メモリを使用したシンプルなCプログラムを作成しました。Linuxで共有メモリを使用する場合のセグメンテーションフォールト(コアダンプ)の修正方法

まだ同じエラーが発生します。私は何を間違えたのですか?

ありがとうございます!

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

void sys_err(char s[]) 
{ 
    perror(s); 
    exit(1); 
} 

int main(int argc, char *argv[]) 
{ 
    int shmid, *shmptr, *ptr; 

    if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0) 
     sys_err("Cannot shmget"); 

    if((shmptr=(int*)shmat(shmid,0,0))<(int*)0) 
     sys_err("Cannot shmat"); 

    shmptr[0]=1; // <----- error: "Segmentation fault (core dumped)" 
    //OR 
    *shmptr=1; // <----- error: "Segmentation fault (core dumped)" 
    //OR 
    ptr=shmptr; // <----- error: "Segmentation fault (core dumped)" 
    *ptr=1; 

    if(shmdt(shmptr)<0) 
     sys_err("Cannot shmdt"); 

    shmctl(shmid,IPC_RMID,0); 

    return 0; 
} 
+3

私はそれが問題だとはわかりませんが、それは* a *の問題です。 'shmat'の結果を' <(int *)0'として比較すると、実装固有の*動作が呼び出されます。または動作しない可能性があります。代わりに '-1='(すなわち' ==(int *)-1')と等しいかどうかを比較してください。 –

+2

私の前回のコメントの補足として、ポインタ自体は実際には*符号なし*整数です。私はCの仕様が何を言っているのかわかりませんが、ポインタがゼロよりも小さいかどうかを確認する操作は、(ポインタが定義されていれば負であってはいけないので)有効であると考えられます。 '-1'(ポインタにキャスト)との直接の等価比較はすべてうまくいっています。 –

+4

警告でコンパイルするとすべてがクリアになります。 'shmid = shmget(...)<0'は、あなたが思うことをしません。また、 '<'で戻り値をチェックすることも悪い考えです。 – Art

答えて

3

最終的に問題が見つかりました。実際には は小さいですこの部分の

if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0) 
    sys_err("Cannot shmget"); 

があります "()" このような穴式囲むように行方不明:

if((shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT))<0) 
    sys_err("Cannot shmget"); 

を今それが実行されます。感謝! ありがとう!

関連する問題