*
* Author: S. Piccardi
*
- * $Id: SharedMem.c,v 1.3 2003/02/02 20:35:33 piccardi Exp $
+ * $Id: SharedMem.c,v 1.8 2003/05/02 09:55:14 piccardi Exp $
*
***************************************************************/
#include <sys/shm.h> /* SysV IPC shared memory declarations */
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
+
+#include "macros.h"
/* *************************************************************************
*
* Functions for SysV shared memory
* the fill value
* Return: the address of the shared memory segment (NULL on error)
*/
-void * ShmCreate(key_t ipc_key, int shm_size, int perm, char fill)
+void * ShmCreate(key_t ipc_key, int shm_size, int perm, int fill)
{
void * shm_ptr;
int shm_id; /* ID of the IPC shared memory segment */
}
/*
* Function ShmRemove:
- * Scheudle removal for a SysV shared memory segment
+ * Schedule removal for a SysV shared memory segment
* Input: an IPC key value
* the shared memory segment size
* Return: 0 on success, -1 on error
* the fill value
* Return: the address of the shared memory segment (NULL on error)
*/
-void * CreateShm(char * shm_name, int shm_size, int perm, char fill)
+void * CreateShm(char * shm_name, off_t shm_size, mode_t perm, int fill)
{
void * shm_ptr;
int fd;
int flag;
/* first open the object, creating it if not existent */
- flag = O_RDWR|O_TRUNC|O_CREAT|O_EXCL;
+ flag = O_CREAT|O_EXCL|O_RDWR;
fd = shm_open(shm_name, flag, perm); /* get object file descriptor */
if (fd < 0) {
+ perror("errore in shm_open");
return NULL;
}
/* set the object size */
if (ftruncate(fd, shm_size)) {
+ perror("errore in ftruncate");
return NULL;
}
/* map it in the process address space */
shm_ptr = mmap(NULL, shm_size, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
if (shm_ptr == MAP_FAILED) {
+ perror("errore in mmap");
return NULL;
}
memset((void *) shm_ptr, fill, shm_size); /* fill segment */
* the shared memory segment size
* Return: the address of the segment (NULL on error)
*/
-void * FindShm(char * shm_name, int shm_size)
+void * FindShm(char * shm_name, off_t shm_size)
{
void * shm_ptr;
int fd; /* ID of the IPC shared memory segment */
/* find shared memory ID */
if ((fd = shm_open(shm_name, O_RDWR|O_EXCL, 0)) < 0) {
+ debug("Cannot open %s\n", shm_name);
return NULL;
}
/* take the pointer to it */
*/
int RemoveShm(char * shm_name)
{
- shm_unlink(shm_name);
- return 0;
+ return shm_unlink(shm_name);
}