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

假设附加进展顺利,invalid argument仅仅意味着该段已经被分离,或者records[0]自从附加设置以来它的值已经改变。

于 2012-11-09T10:15:35.077 回答
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 回答