我有:
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);
}
任何想法?谢谢
答案 0 :(得分: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");
}
答案 1 :(得分:1)
假设附件顺利进行,invalid argument
只是意味着该段已经分离,或者records[0]
的值已经更改,因为它是通过附加设置的。