The following example shows a complete program which allocates shared memory and starts FIT2D as a sub-process. The operations performed are trivial, but it should be able to serve as a useful template for real applications.
#define _POSIX_SOURCE 1
#define _SVID_SOURCE 1
#include <stdio.h>
#include <errno.h>
#include <sys/shm.h>
/*+---------------------------------------------------------------------------*/
/* RunFIT2D as a sub-process test */
int main (int argc, char **argv)
{
/* Local Constants */
#define MAX_INPUT 256
/* Local Variables */
float *ARRAYS; /* Pointer to shared memory arrays */
FILE *command; /* File (pipe) for commands to FIT2D */
char string[512]; /* Command string to run FIT2D */
int memory_id; /* Identifier for shared memory */
int num_bytes; /* Number of bytes of memory to allocated */
int x; /* Loop variable for X-direction */
int xdim = 1024; /* X-dimension of array */
int y; /* Loop variable for Y-direction */
int ydim = 1024; /* Y-dimension of array */
/* Calculate size of shared memory segment */
num_bytes = f2d_sharedsizec (xdim, ydim, TRUE, FALSE);
printf ("Size of shared memory segment = %i\n", num_bytes);
/* Create new shared memory section */
memory_id = shmget(97, num_bytes, 0777 | IPC_CREAT);
printf ("memory_id = %i\n", memory_id);
/* Check memory identifier */
if (memory_id == -1) {
printf ("Problem creating shared memory:\n");
if (errno == EINVAL) {
printf ("problem with size being out of range\n");
} else if (errno == EEXIST) {
printf ("problem caused by segment already existing\n");
}
exit (0);
}
/* Attach to shared memory */
if ((ARRAYS = shmat (memory_id, (float *) 0, 0)) == NULL) {
printf("Could not attach shared memory\n");
exit (0);
}
printf ("runfit2d: After shmat, base address = %i\n", ARRAYS);
/* Fill "DATA" array with some values */
for (y = 0; y < ydim; y = y + 1) {
for (x = 0; x < xdim; x = x + 1) {
ARRAYS[x + y * xdim] = Real((x - y) % 512);
}
}
printf ("runfit2d: Ready to call FIT2D\n");
/* Write FIT2D start-up command string */
sprintf (string,
"/users/hammersl/FIT2D/LINUX/fit2d -dim%ix%i -com -data -id=%i",
xdim, ydim, memory_id);
/* Open FIT2D as a sub-process with input through a pipe */
command = (FILE *) popen (string, "w");
/* Check sub-process has been started O.K. */
if (command == NULL) {
printf ("Problem starting sub-process");
exit (0);
}
/* Send commands to FIT2D */
fprintf (command, "I ACCEPT\n");
fflush (command);
/* Enter Image Processing interface to display data */
fprintf (command, "IMAGE\n");
fflush (command);
/* Input image */
fprintf (command, "INPUT\n");
fprintf (command, "/DATA/test_001.mar3450\n");
fflush (command);
sleep(4);
/* Zoom in */
/* fprintf (command, "ZOOM IN\n");
fprintf (command, "2\n");
fprintf (command, "100.0\n");
fprintf (command, "100.0\n");
fprintf (command, "900.0\n");
fprintf (command, "800.0\n");
fflush (command); */
sleep(4);
/* Exit interface */
fprintf (command, "EXIT\n");
/* Close FIT2D */
fprintf (command, "EXIT FIT2D\n");
fprintf (command, "YES\n");
fflush (command);
/* Detach from shared memory */
shmdt (ARRAYS);
/* Delete shared memory segment */
if (shmctl (memory_id, IPC_RMID , NULL) != 0) {
printf ("ERROR: shmctl failed to remove shared memory segment\n");
}
/* Close pipe */
pclose (command);
exit (0);
}