Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1185
  • Last Modified:

shmget returning 0

I have written this code

The call to CreateSharedMem creates and returns the id of shared memory segment but when i call GetSharedMem it returns 0?

Any idea what i am doing wrong ?

Thank You
int CreateSharedMem(char* key_file, char id, int seg_size)
{
        int shm_id;
        key_t keyval;
        if ((keyval = ftok(key_file,id))==-1)
        {
        	perror("ftok");
        	return -1;
        } 
        // Can use IPC_EXCL which will fail and returns -1 if a segment with the same key exists
        if((shm_id = shmget( keyval, seg_size, IPC_CREAT | 0666 | IPC_EXCL )) == -1)
        {
        		perror("shmget");
                return(-1);
        }
   
        return(shm_id);
}
 
int GetSharedMem(char* key_file,char id, int seg_size)
{
        int shm_id;
        key_t key_val;
        if ((key_val = ftok(key_file,id))==-1)
        {
        	perror("ftok");
        	return -1;
        } 
        printf("Key is %d",key_val);
        // Can use IPC_EXCL which will fail and returns -1 if a segment with the same key exists
        if((shm_id = shmget( key_val , seg_size, IPC_CREAT | 0666 ) == -1))
        {
        		perror("shmget");
                return(-1);
        }
        return(shm_id);
	
}
 
main()
{
.
.
 
 /* Create a shared memory */
	int my_shm_id = CreateSharedMem("MySharedMem.c",'A',1000);
	printf("%d : Shared mem is created\n",my_shm_id);
	
	
/* Get the same shared memory */
       int my_shm_id = GetSharedMem("MySharedMem.c",'A',1000);	
       printf("%d is Shared mem that is created\n",my_shm_id);
.
.
}

Open in new window

0
Novice_
Asked:
Novice_
1 Solution
 
Infinity08Commented:
Due to operator precedence, this :

        if ((shm_id = shmget( key_val , seg_size, IPC_CREAT | 0666 ) == -1))

is the same as this :

        if ((   shm_id = (shmget( key_val , seg_size, IPC_CREAT | 0666 ) == -1)   ))

So, you check whether the return value of shmget is == -1, and then you place the result of that comparison in shm_id (0 if false, non-zero if true).

shm_id being 0 means that the shmget call succeeded.


I would suspect that you intended this instead :

        if ((shm_id = shmget( key_val , seg_size, IPC_CREAT | 0666 )) == -1)
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now