Instead of using shmat, how about mmap? This solves the storage problem -- you no longer need to explicitly write to disk, just alter the memory and the OS will follow suit. It also makes it possible to use data larger than your system's memory without excessive swapping, since it only reads in the parts you're presently using. It also makes it easier for your readers to find the file -- it's just an ordinary file, not some weird special memory object thingamabob.
It does make the file fixed length though -- or at least, cumbersome to change the length of.
Code:
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
...
mystruct str, *shared;
int fd, n, len;
fd=open("filename", O_RDWR);
memset(&str, 0, sizeof(str));
// Create a blank file 1024 records long
for(n=0; n<1024; n++)
{
write(fd, &str, shared);
}
// Mapped area must be a multiple of the page size
len=sizeof(str) * 1024;
if(len % getpagesize())
{
len -= (len % getpagesize());
len += getpagesize();
}
// Map the file into memory.
mystruct *mem=mmap(NULL, len, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);
// We can now close the fd.
close(fd);
if(mem == MAP_FAILED)
{
fprintf(stderr, "Couldn't map memory\n");
}
else
{
fprintf(stderr, "mapped into %p\n", mem);
// As the contents of the memory change, so will the contents on disk.
// This I/O may just be cached in memory for the OS to write when
// convenient, but the data shared between processes will remain
// current and consistent.
strcpy(mem[0].fName, "Foo");
strcpy(mem[0].lName, "Bar");
munmap(mem, len);
}
HI,
I am dynamically loading shared libraries using shl_load(). There are multiple processes (50 or more) which loads the same shared library. Will Unix internally load only one copy of the shared library or it will load multiple copies.
Can I have memory issues if this is done.
Thanks,... (1 Reply)
I am debugging in gdb a program that dynamically loads libodbcinst.so. I want to debug the code from libodbcinst - I can break in it, see the source and step through it, but whenever I try printing a variable, I get (e.g. for the variable ret):
No symbol "ret" in current context.
In my program... (0 Replies)
Hello,
I wonder if I can write my userdefined data structures(ex: a list) to a shared memory segment?
I know, the shm functions get (void*) parameter so I should be able to read and write a list into the shared memory.
may someone inform and clarify me about that, please? (1 Reply)
Hi All
I have been given by someone else header file and a shared library to be used by my C++ application. Compilation is fine but when I try to executes the application I receive the following error.
./first: error while loading shared libraries: libMyLib.so.9: cannot open shared object file:... (2 Replies)
Hi,
I have an application running on AIX. The app is deployed on Webspshere server. Due to some reason, i have to make use of a third party library (Sigar API's) from my application. This library requires an .so file as well.
Is there any location where i can put this *.so file and it will... (1 Reply)
Hello.
I am new to this forum and I would like to ask for advice about low level POSIX programming.
I have to implement a POSIX compliant C shared library.
A file will have some variables and the shared library will have some functions which need those variables.
There is one special... (5 Replies)
Hello,
I am trying to run a program from my local account and receive the following error:
/local/app: error while loading shared libraries: libtiff.so.3: cannot open shared object file: No such file or directory
On the root account (which I DO NOT have access to), I see that libtiff.so.4... (3 Replies)
I am trying to run a C++ program which uses a static library libprun.a. During compilation, I am loading this library file using a environment variable as below.
LIBDIR = ${CUSTOM_PATH}/lib
LOADLIBS = $(LIBDIR)/libgqlcomm.a \
$(LIBDIR)/libgsml.a \
... (7 Replies)
Discussion started by: vdivb
7 Replies
LEARN ABOUT HPUX
shm_unlink
shm_unlink(2) System Calls Manual shm_unlink(2)NAME
shm_unlink - unlink a shared memory object
SYNOPSIS DESCRIPTION
The system call removes the name of the shared memory object named by the string pointed to by name. If one or more references to the
shared memory object exists when the object is unlinked, the name will be removed before returns, but the removal of the memory object con-
tents will be postponed until all open and map references to the shared memory object have been removed.
RETURN VALUE
returns the following values:
Successful completion.
Failure,
is set to indicate the error.
ERRORS
If fails, is set to one of the following values:
[EACCES] Permission to unlink the named shared memory object is denied.
[ENAMETOOLONG] The length of the name string exceeds or the length of a (pathname) component of the name string exceeds while is in
effect.
[ENOENT] The named shared memory object does not exist.
[ENOSYS] is not supported by the implementation.
SEE ALSO shm_open(2), close(2), mmap(2), munmap(2), privileges(5).
STANDARDS CONFORMANCE shm_unlink(2)