Visit Our UNIX and Linux User Community


Loading Data in shared memory (C++)


 
Thread Tools Search this Thread
Top Forums Programming Loading Data in shared memory (C++)
# 1  
Old 10-29-2010
Loading Data in shared memory (C++)

I'll try to keep this short, but basically I need to figure out a way to load data in shared memory (this file will be called load.c) I will later access the data with a print.c program.
The "data" is in the form of a student database that looks like this
Code:
John Blakeman

111223333

560 Southbrook Dr. Lexington,  KY 40522

8591112222

Paul S Blair

111223344

3197 Trinity Rd. Lexington,  KY 40533

etc....

I store it in a struct that i defined in a header file that looks like this(the ssn's are fake obviously, they are later used for a "change.c" portion)
Code:
#define KEY ((key_t)(10101)) /* Change to Last 5 digits of SSN */
#define SEGSIZE sizeof(struct StudentInfo)

#define NUM_SEMAPHS 5
#define SEMA_KEY ((key_t) (1010)) /* Last 4 digits of SSN */

struct StudentInfo{
char fName[20];
char lName[20];
char telNumber[15];
char whoModified[10];
};

void Wait(int semaph, int n);
void Signal(int semaph, int n);
int GetSemaphs(key_t k, int n);

Basically Im trying to figure out the best way to load an undefined number of "entires" of students into shared memory, so that I can access them later. I think I have the beginning part done...

Code:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include "header.h"

main()
{   
    int i,id;
    struct StudentInfo *infoptr;
    int sema_set;

    id = shmget(KEY, SEGSIZE,IPC_CREAT|0666); /* get shared memory to store data */
    if (id < 0){
        perror("create: shmget failed");
        exit(1);
}

    infoptr=(struct StudentInfo *)shmat(id,0,0); /* attach the shared memory segment to the process's address space */

    if(infoptr <= (struct StudentInfo *) (0)) {
        perror("create: semget failed");
        exit(2);
    }

/* store data in shared memory segment */
//here's where I need help

However Im unsure of how to go about reading them in, I would assume I could store them in a vector/array.....but I wouldn't know how to do that when It came around to accessing them, especially when I dont know how many there are.

I do need to provide mutual exclusion (no more than one writer, but as many readers as I want)...altho Im a bit unsure of how many sephamores to use, I was using a default of 5.....but Im not sure if that is correct...Also I know i need to synchronize concurrent access since multiple writers/readers will be accessing change.c. The whole sephamores thing is a tad confusing tho...

Any hints/ideas/tips would be SUPER helpful. im not asking for an answer, but maybe a point in the right direction. Shared memory is a new thing for me.

Last edited by Mercfh; 10-29-2010 at 11:50 PM..
# 2  
Old 10-30-2010
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);
}

# 3  
Old 10-30-2010
unfortunately i have to use shmat <_<. sadly.
am I at least "close" to my implementation using shmat?
# 4  
Old 10-30-2010
Is this homework? Sounds like it. We have a special forum for homework. Stipulations like yours generally arise from two sources: crazed management or classroom assignments. The "crazed" part applies to both.
# 5  
Old 10-30-2010
It's homework, i wasn't aware there was a special forum (srry) but thats also why i wasn't asking for an answer, i was just asking of ways to do things Smilie
# 6  
Old 10-30-2010
We appreciate that sentiment, hence why we have a forum for homework at all. But this isn't it.
# 7  
Old 10-30-2010
So do you want me to repost it in the HW section? or can it be like "moved"?

Previous Thread | Next Thread
Test Your Knowledge in Computers #976
Difficulty: Medium
In April 2014, Linus Torvalds banned Kay Sievers from submitting patches to the Linux kernel for failing to deal with bugs that caused systemd to negatively interact with the kernel.
True or False?

10 More Discussions You Might Find Interesting

1. Programming

Error while loading shared libraries

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

2. UNIX for Dummies Questions & Answers

Error while loading shared libraries

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)
Discussion started by: bphqk3
3 Replies

3. Programming

Shared library with acces to shared memory.

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)
Discussion started by: iamjag
5 Replies

4. AIX

Loading a shared library in AIX

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)
Discussion started by: user_guest
1 Replies

5. Programming

Loading the shared library I want

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)
Discussion started by: manustone
2 Replies

6. Programming

shared memory - userdefined data structures

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)
Discussion started by: xyzt
1 Replies

7. Programming

gdb - loading symbols of shared library

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)
Discussion started by: rimon
0 Replies

8. HP-UX

Loading shared Libraries dynamically

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)
Discussion started by: Debasisb2002
1 Replies

9. Programming

mmap vs shared memory - which is faster for reading data between multiple process

Between mmap and shared memory which is the best method of sharing data between multiple applications, interms of speed? (1 Reply)
Discussion started by: nmds
1 Replies

10. UNIX for Advanced & Expert Users

mmap vs shared memory - which is best for sharing data between applications?

Between mmap and shared memory which is the best method of sharing data between multiple applications, interms of speed? (2 Replies)
Discussion started by: nmds
2 Replies

Featured Tech Videos