I've simplified the code and I still can't see what the problem is...
Code:
int getsharedmem(void)
{
#define THREE 3
size_t shared_data_size;
size_t sizeofSharedData;
size_t sizeofTriggerData;
long monitorImageBufferCount;
size_t sizeofStructTimeval;
long monitorWidth;
long monitorHeight;
int shmid;
sizeofSharedData = sizeof(SharedData);
sizeofTriggerData = sizeof(TriggerData);
monitorImageBufferCount = *monitor[cam]->image_buffer_count;
sizeofStructTimeval = sizeof(struct timeval);
monitorWidth = *monitor[cam]->width;
monitorHeight = *monitor[cam]->height;
shared_data_size = sizeofSharedData + sizeofTriggerData + (monitorImageBufferCount * sizeofStructTimeval) +
((monitorImageBufferCount * monitorWidth) * (monitorHeight) * THREE);
if((shmid=shmget((shm_key&0xffffff00)|monitor[cam]->mon_id,shared_data_size,SHM_R))==-1)
{
printf("Dump:\n");
if(errno == EINVAL)
printf("shmget returned EINVAL, ");
else if(errno == EEXIST)
printf("shmget returned EEXIST, ");
else if(errno == EIDRM)
printf("shmget returned EIDRM, ");
else if(errno == ENOENT)
printf("shmget returned ENOENT, ");
else if(errno == EACCES)
printf("shmget returned EACCES, ");
else if(errno == ENOMEM)
printf("shmget returned ENOMEM, ");
printf("%s\n",strerror(errno));
printf("cam = %d\n", cam);
printf("sizeofSharedData = %d\n", sizeofSharedData);
printf("sizeofTriggerData = %d\n",sizeofTriggerData);
printf("monitorImageBufferCount = %ld\n", monitorImageBufferCount);
printf("sizeofSructTimveval = %d\n", sizeofStructTimeval);
printf("monitorWidth = %ld\n", monitorWidth);
printf("monitorHeight = %ld\n", monitorHeight);
printf("shared_data_size = %u\n", shared_data_size);
return EXIT_FAILURE;
}
return 0;
}
and the output is :
Code:
Dump:
shmget returned EINVAL, Invalid argument
cam = 0
sizeofSharedData = 312
sizeofTriggerData = 332
monitorImageBufferCount = 40
sizeofSructTimveval = 8
monitorWidth = 320
monitorHeight = 240
shared_data_size = 9216964