2016-05-10 10 views
0

私は共有メモリを使用したプロジェクトを持っており、毎回whileループを読み込んでいるので、空であることを確認したい。 使用して、共有メモリを開くためのコード:共有メモリが空であるかどうかをチェックする方法?

segmentation fault (core dumped) 

..HELP:

key_t key; 
int shmid; 
if ((key = ftok("ex31.c", 'k')) == -1){ 
    perror("ftok"); 
    exit(1);} 
if ((shmid = shmget(key, 3, FLAGS)) == -1) { 
      perror("shmget"); 
      exit(1);} 
char* shmaddr; 
if(shmaddr=shmat(shmid,0,0) == (char*)-1){ 
    printf("error in attaching to the shared memory\n"); 
    exit(0);} 
if(shmaddr==NULL) /// THROWS EXCEPTION!! 

それは私にエラーを与えて?

+2

実際にコンパイルして同じ結果を得ようとする例を挙げてください。 –

+0

#defineフラグIPC_CREAT | 0644たぶん、このコードは役に立ちません。それ以外には何も表示されません –

+0

デバッガがない場合は、各行をprintf()して、どの命令が実際にseg-faultを引き起こしたかを判断できるようにします。今、それはあなたの機能のいずれかにある可能性があります。メモリとレジスタ、およびスタックトレースのような他の機能があれば(コアダンプされた)出力は、本当に助けになるかもしれません。 if文でエラーが発生している場合は、事前にshmaddrを出力して、実際にアクセスできるかどうかを確認してください。 –

答えて

2

私はあなたがこの完全なプログラムを簡単に見ていると42の引数を指定して、もう一度、最初の-1の引数で、あなたはそれを2回実行したときに何が起こるか見てお勧め:

#include <stdio.h> 
int main (int argc, char *argv[]) { 
    int i; 
    if (i = atoi (argv[1]) == -1) 
     printf (" WAS negative one: %d\n", i); 
    else 
     printf (" was NOT negative one: %d\n", i); 
    return 0; 
} 

次のように転写物がある:

pax> ./testprog -1 
    WAS negative one: 0 
pax> ./testprog 42 
    was NOT negative one: 1 

あなたはそれが正しくatoi値を検出していても、iをtないように見える、ということがわかりますo比較後に正しく設定してください。

この問題を解決するためにどのようにあなたのコードを見れば、あなたはすでにを知っている(またはあなたがこの回答を読み終えたらすぐには、知っているだろう)。他の1(両方は少しそれが明白にするために再フォーマット)を使用して誤った行の比較:

if ((shmid = shmget (key, 3, FLAGS)) == -1  ) { 
if (shmaddr = shmat (shmid, 0, 0 ) == (char*)-1) { 
//^        ^
// \_______extra parentheses_______/ 

===より高い優先度を持っているので、あなたが期待するように、第2のラインが動作しない理由はあります。 1のための(あなたが見ることができるように

if (shmaddr = (shmat (shmid, 0, 0) == (char*)-1)) { 
// \   \________higher________________//
// \____________________lower________________/ 

、その優先順位のルールは表現shmat (shmid, 0, 0) == (char*)-1が最初にし、その結果を評価されていることを意味します。それは、最初の行は、あなたが何をしたいんが、2番目が効果的にであることを意味しtrueまたは0(falseの場合)はshmaddrに割り当てられます。これらの値はどちらもです。は有効なメモリアドレスではありそうにないので、逆参照しようとするとクラッシュする可能性がほとんどあります。(a)

あなたはそれが最初に行うのを保証するために割り当て周りの括弧で、他の二つの形式と一致する必要があります必要ライン:

if ((shmaddr = shmat (shmid, 0, 0)) == (char*)-1)) { 
//^       ^
// \__________add these_________/ 

1がある割り当てられているの(a)の場合にあなたのケースとは無関係です。これは、ifの条件が真と評価され、プログラムが終了することを意味します。したがってのコードへの経路は、を参照して0に設定します。

関連する問題