2

私は持っています:

int array_id;
char* records[10];

// get the shared segment
if ((array_id = shmget(IPC_PRIVATE, 1, 0666)) == -1) {
            perror("Array Creating");
}

// attach
records[0] = (char*) shmat(array_id, (void*)0, 0);
if ((int) *records == -1) {
     perror("Array Attachment");
}

これは正常に機能しますが、デタッチしようとすると「無効な引数」エラーが発生します。

// detach
int error;
if( (error = shmdt((void*) records[0])) == -1) {
      perror(array detachment);   
}

何か案は?ありがとうございました

4

2 に答える 2

1

ではshmdt()、ポインタ引数をそれに変換する必要はなく、void*自動的にこれを処理します。

から削除(void*)shmdt((void*) records[0]))ます。こんな感じになります。

if ((error = shmdt(records[0]) ) == -1)
{
  perror("Array detachment");
}

そしてそれは動作します。

また、shmat()では、エラーが発生すると返さ(void*) -1れるため、比較すると警告が表示されます。だからこのようにしてください

if ((char *)records[0] == (void *)-1)
{
  perror("Array Attachment");
}
于 2012-11-09T06:01:28.123 に答える
1

アタッチがうまくいったとinvalid argumentすると、セグメントがすでに切り離されているか、records[0]アタッチによって設定されてからの値が変更されていることを意味します。

于 2012-11-09T10:15:35.077 に答える