다음 코드를 작성했지만 코드는 여전히 이 메모리를 확장하는 데 실패했음을 알리는 EEERROR
메시지를 전달합니다.mremap 함수가 새 메모리를 할당하지 못했습니다.
int main()
{
int size_of_mem = 1024
int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRWXO | S_IRUSR | S_IWUSR);
if (fd == -1)
printf("ERROR in shm_open \n") ;
if (ftruncate(fd, size_of_mem) == -1)
printf("ERROR in ftruncate \n") ;
int shm_address = mmap(0 , size_of_mem , PROT_READ | PROT_WRITE | PROT_EXEC ,MAP_SHARED , fd , 0) ;
if (shm_address == MAP_FAILED)
{
printf("Error mmapping the file \n");
exit(EXIT_FAILURE);
}
int temp = mremap(shm_address , size_of_mem ,4000 , MREMAP_MAYMOVE) ;
if(temp < 0)
{
printf("EEEEEEEERROR\n") ;
}
return 0 ;
}
나는 당신이 말한 것과 그 일을 적용했습니다! ,하지만 첫 번째 지점에서, 나는'int'에 반환 값을 캐스팅했습니다, 그리고 그것은 또한 반환 값을 캐스팅하지 않으며 작동합니다! 둘째, 메모리 주소가 음수 일 수 있습니다 (int로 캐스팅 한 경우에도 마찬가지 임) .. thanks in advanace. – hbak
작동한다고해서 그것이 올바른 것을 의미하지는 않습니다. 예를 들어, 64 비트 시스템에서는 실패합니다. 32 비트 아키텍처에서도 여전히 잘못되었습니다. 포인터는 0에서 0xFFFFFFFF로 이동합니다.이를 "int"에 매핑하면 0 - 0x7FFFFFFF는 양수이고, 0x80000000 - 0xFFFFFFFF는 음수입니다. 그래서''int''에 대한 매핑과''temp <0'' 체크가 잘못된 것입니다. 0x81230000과 같은 유효한 포인터는 음의 정수로 매핑되기 때문에 오류로 취급합니다. –
질문이 하나 더 있습니다. 'temp'를'unsigned int'로 만들면 'temp <0'조건이 작동합니까? – hbak