Date: Wed, 14 Jun 2000 20:03:52 -0700 (PDT) From: Shawn Workman <shawn@holdenz.com> To: freebsd-hackers@freebsd.org Subject: Programming problem, Shared Memory Message-ID: <200006150303.UAA47225@holdennt.holdenz.com>
index | next in thread | raw e-mail
Please help me with the simple 'Shared Memory' example.. I cant use fork, many different
applications may speaking to one 'server' application..
This small function can run as the memory server (pass bogus parameters) and as a client
in another terminal (dont pass any parameters) I can read from the server the int and
string but not the server allocated string..
What am I doing worng??
Please examine: (yes -- very new to NOT USING WINDOWS OS's)
file://FreeBSD 4.0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <machine/param.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
struct SharedMemBlock
{
char *APtr; // To be allocated
int AInt; // A simple set
char AStr[40]; // A simple Set
};
SharedMemBlock *SMB = NULL;
int main (int argc, char *argv[])
{
key_t KeyToIt = ftok(".",'8');
int shmid;
if (argc > 2) // Any passed junk -- just tell is to be a 'server'
{
if ((shmid = shmget(KeyToIt, sizeof (struct SharedMemBlock),IPC_CREAT|IPC_EXCL|0666))
== -1)
{
printf("Already exists -- Please shutdown originating server");
}
else
{
SMB = (struct SharedMemBlock *)shmat(shmid,0,0);
SMB->AInt = 97; // A simple set
strcpy(SMB->AStr,"Hello how are you"); // A simple set
if ((SMB->APtr = (char *)malloc(100) ) != NULL)
{
printf("APtr Allocated");
strcpy(SMB->APtr,"WOW IT WORKED");
}
else
{
printf("No APtr Allocated");
}
// OK, the 'server' is up, now with another xterm run this same
// program again WITHOUT passing any parameters.. that is the 'Client'
// You can run the client as many times as you wish.. Util the Server's
// getchar() is satisfied....
getchar();
if (SMB->APtr != NULL)
{
free(SMB->APtr);
SMB->APtr = NULL;
}
}
}
else
{
// This is the client who wants to read the servers memory....
if ((shmid = shmget(KeyToIt, sizeof (struct SharedMemBlock),IPC_EXCL|0666)) == -1)
{
printf("Please Start Server (Same but pass params)");
}
else
{
SMB = (struct SharedMemBlock *) shmat(shmid,0,0);
printf("---%d\n%s\n\n\n", SMB->AInt,SMB->AStr);
if (SMB->APtr != NULL) // The problem is RIGHT HERE!!!!
printf("Now trying allocated server pointer\n[%s]", SMB->APtr);
else
printf("No allocated server pointer");
}
}
return(0);
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006150303.UAA47225>
