143 lines
4.5 KiB
HTML
143 lines
4.5 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
||
|
<!--Converted with LaTeX2HTML 96.1-c (Feb 29, 1996) by Nikos Drakos (nikos@cbl.leeds.ac.uk), CBLU, University of Leeds -->
|
||
|
<HTML>
|
||
|
<HEAD>
|
||
|
<TITLE>The Source</TITLE>
|
||
|
<META NAME="description" CONTENT="The Source">
|
||
|
<META NAME="keywords" CONTENT="lpg">
|
||
|
<META NAME="resource-type" CONTENT="document">
|
||
|
<META NAME="distribution" CONTENT="global">
|
||
|
<LINK REL=STYLESHEET HREF="lpg.css">
|
||
|
</HEAD>
|
||
|
<BODY LANG="EN">
|
||
|
<A NAME="tex2html1370" HREF="node82.html"><IMG WIDTH=37 HEIGHT=24 ALIGN=BOTTOM ALT="next" SRC="next_motif.gif"></A> <A NAME="tex2html1368" HREF="node73.html"><IMG WIDTH=26 HEIGHT=24 ALIGN=BOTTOM ALT="up" SRC="up_motif.gif"></A> <A NAME="tex2html1364" HREF="node80.html"><IMG WIDTH=63 HEIGHT=24 ALIGN=BOTTOM ALT="previous" SRC="previous_motif.gif"></A> <A NAME="tex2html1372" HREF="node1.html"><IMG WIDTH=65 HEIGHT=24 ALIGN=BOTTOM ALT="contents" SRC="contents_motif.gif"></A> <BR>
|
||
|
<B> Next:</B> <A NAME="tex2html1371" HREF="node82.html">7 Sound Programming</A>
|
||
|
<B>Up:</B> <A NAME="tex2html1369" HREF="node73.html">shmtool: An interactive shared </A>
|
||
|
<B> Previous:</B> <A NAME="tex2html1365" HREF="node80.html">Examples</A>
|
||
|
<BR> <P>
|
||
|
<H4><A NAME="SECTION00744740000000000000">The Source</A></H4>
|
||
|
<P>
|
||
|
<P>
|
||
|
<HR><PRE>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/ipc.h>
|
||
|
#include <sys/shm.h>
|
||
|
#include <ctype.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#define SEGSIZE 100
|
||
|
|
||
|
void usage();
|
||
|
void writeshm(int shmid, char *segptr, char *text);
|
||
|
void changemode(int shmid, char *mode);
|
||
|
void removeshm(int shmid);
|
||
|
void readshm(int shmid, char *segptr);
|
||
|
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
key_t key;
|
||
|
int shmid, cntr;
|
||
|
char *segptr;
|
||
|
|
||
|
if(argc == 1)
|
||
|
usage();
|
||
|
|
||
|
/* Create unique key via call to ftok() */
|
||
|
key = ftok(".", 'S');
|
||
|
|
||
|
/* Open the shared memory segment - create if necessary */
|
||
|
if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1)
|
||
|
{
|
||
|
printf("Shared memory segment exists - opening as client\n");
|
||
|
|
||
|
/* Segment probably already exists - try as a client */
|
||
|
if((shmid = shmget(key, SEGSIZE, 0)) == -1)
|
||
|
{
|
||
|
perror("shmget");
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Creating new shared memory segment\n");
|
||
|
}
|
||
|
|
||
|
/* Attach (map) the shared memory segment into the current process */
|
||
|
if((segptr = (char *)shmat(shmid, 0, 0)) == (char *)-1)
|
||
|
{
|
||
|
perror("shmat");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
switch(tolower(argv[1][0]))
|
||
|
{
|
||
|
case 'w': writeshm(shmid, segptr, argv[2]);
|
||
|
break;
|
||
|
case 'r': readshm(shmid, segptr);
|
||
|
break;
|
||
|
case 'd': removeshm(shmid);
|
||
|
break;
|
||
|
case 'm': changemode(shmid, argv[2]);
|
||
|
break;
|
||
|
default: usage();
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
writeshm(int shmid, char *segptr, char *text)
|
||
|
{
|
||
|
strcpy(segptr, text);
|
||
|
printf("Done...\n");
|
||
|
}
|
||
|
|
||
|
readshm(int shmid, char *segptr)
|
||
|
{
|
||
|
printf("segptr: %s\n", segptr);
|
||
|
}
|
||
|
|
||
|
removeshm(int shmid)
|
||
|
{
|
||
|
shmctl(shmid, IPC_RMID, 0);
|
||
|
printf("Shared memory segment marked for deletion\n");
|
||
|
}
|
||
|
|
||
|
changemode(int shmid, char *mode)
|
||
|
{
|
||
|
struct shmid_ds myshmds;
|
||
|
|
||
|
/* Get current values for internal data structure */
|
||
|
shmctl(shmid, IPC_STAT, &myshmds);
|
||
|
|
||
|
/* Display old permissions */
|
||
|
printf("Old permissions were: %o\n", myshmds.shm_perm.mode);
|
||
|
|
||
|
/* Convert and load the mode */
|
||
|
sscanf(mode, "%o", &myshmds.shm_perm.mode);
|
||
|
|
||
|
/* Update the mode */
|
||
|
shmctl(shmid, IPC_SET, &myshmds);
|
||
|
|
||
|
printf("New permissions are : %o\n", myshmds.shm_perm.mode);
|
||
|
}
|
||
|
|
||
|
usage()
|
||
|
{
|
||
|
fprintf(stderr, "shmtool - A utility for tinkering with shared memory\n");
|
||
|
fprintf(stderr, "\nUSAGE: shmtool (w)rite <text>\n");
|
||
|
fprintf(stderr, " (r)ead\n");
|
||
|
fprintf(stderr, " (d)elete\n");
|
||
|
fprintf(stderr, " (m)ode change <octal mode>\n");
|
||
|
exit(1);
|
||
|
}</PRE>
|
||
|
<HR>
|
||
|
<P>
|
||
|
<BR> <HR>
|
||
|
<P><ADDRESS>
|
||
|
<I>Converted on: <BR>
|
||
|
Fri Mar 29 14:43:04 EST 1996</I>
|
||
|
</ADDRESS>
|
||
|
</BODY>
|
||
|
</HTML>
|