home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_09_03 / 9n03056a < prev    next >
Text File  |  1990-12-10  |  2KB  |  70 lines

  1. Listing 5 (lidar_write.c) 
  2. /* ---
  3.    lidar_write task.  This task waits for a 
  4.    message from the read routine.  When a message
  5.    arrives, a frame buffer is writtem to disk.
  6.    After the write, the message is enqueued
  7.    onto the graph queue.
  8. --- */
  9.  
  10. #include    "lidar.h"
  11.  
  12. main()
  13. {
  14.     int     raw_fd, alive_sem;
  15.     int     terminate = 0;
  16.     int     graph_qid, write_qid;
  17.     char    *fb_shm;
  18.     message mptr;
  19.  
  20.     /* --- set process priority --- */
  21.     setpriority (PRIO_PROCESS, 0, LIDAR_WRITE);
  22.  
  23.     /* --- open message queues --- */
  24.     graph_qid = msgget (GRAPHICS_Q,  0666 | IPC_CREAT);
  25.     write_qid = msgget (WRITE_Q, 0666 | IPC_CREAT);
  26.  
  27.     /* --- get alive semaphore --- */
  28.     alive_sem = sem_get (ALIVE_KEY, 0);
  29.  
  30.     /* -- create shared memory buffer  -- */
  31.     fb_shm = shmat (shmget (FB_KEY, FRAME_SIZE * N_FRAMES, 
  32.                     0666 | IPC_CREAT), 0, 0);
  33.  
  34.     /* --- create a contiguous file --- */
  35.     mkcontig ("test.out", S_IWRITE, (long)N_RUNS *
  36.               (long)FRAME_SIZE);
  37.  
  38.     /* --- open raw, write file --- */
  39.     if ((raw_fd = open("test.out", O_WRONLY|O_CREAT)) == -1) {
  40.         printf("Unable to open raw file: lidar_write.\n");
  41.         exit (1);
  42.         }
  43.  
  44.     /* --- tell the world we're open for business --- */
  45.     sem_signal (alive_sem);
  46.  
  47.     /* --- main write loop --- */
  48.     while (!terminate) {
  49.        /* --- wait for a buffer --- */
  50.        msgrcv (write_qid, &mptr, MSG_SIZE, ANYTYPE, NOFLAGS);
  51.  
  52.        /* --- check for terminate --- */
  53.        if (mptr.key == QUIT)
  54.           terminate = 1;
  55.        else 
  56.           write (raw_fd, fb_shm + mptr.key * FRAME_SIZE,
  57.                      WRITE_SIZE); 
  58.  
  59.        /* --- pass frame buffer to graphics/processing 
  60.               task --- */
  61.        msgsnd (graph_qid, &mptr, MSG_SIZE, IPC_NOWAIT);
  62.        }
  63.  
  64.     /* -- release memory -- */
  65.     shmdt (fb_shm);
  66.  
  67.     /* --- close device --- */
  68.     close (raw_fd);
  69. }
  70.