home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #2 / RBBS_vol1_no2.iso / add2 / pctj8812.zip / QDEMO1.C next >
Text File  |  1989-01-05  |  6KB  |  143 lines

  1. /* QDEMO1.C - Parent program for demonstrating Queue usage. 
  2.  * Copyright (c) 1988 PC Tech Journal and Ziff-Davis Publishing Co.
  3.  * Written by Ted Mirecki
  4.  */
  5. #define INCL_DOS        /* include all DOS* function prototypes */
  6. #include  <os2.h>
  7.                         /* Q item type codes:                    */
  8. #define I_NUM 0         /*    long int, not pointer              */
  9. #define I_NAME 1        /*    ptr to named shared mem            */
  10. #define I_OWN 2         /*    ptr to owner's memory (given)      */
  11. #define I_DISJ 3        /*    ptr to disjoint memory (gettable)  */
  12.  
  13. char fmt[20];        /* Format string for progress messages */
  14. char Pname[] = "QDEMO2.EXE";
  15. char Qname[] = "\\QUEUES\\TEST00.Q";
  16. char Mname[] = "\\SHAREMEM\\TEST00.SEG";
  17. struct {
  18.    char arg0[sizeof(Pname)];
  19.    char arg1[sizeof(Qname)];
  20.    char arg2[sizeof(Mname)];
  21. } args;
  22.  
  23. SEL   NamedSeg;            /* selector of named shared memory */
  24. HQUEUE Qhan;               /* handle of queue       */
  25. int   err;
  26. PID   progid;              /* process ID of this program */
  27.  
  28. main()
  29. {
  30.    LINFOSEG far *local;       /* ptr to Local Info seg */
  31.    SEL   Gseg, Lseg;          /* selectors for info segs*/
  32.    char far *outmsg;
  33.    char  missing[65];         /* returned values from DosExecPgm */
  34.    RESULTCODES results;
  35. /******************************************************************
  36.    INITIALIZE:  create the queue, allocate named shared memory
  37.  ******************************************************************/
  38.    DosGetInfoSeg(&Gseg, &Lseg);   /* get info segments */
  39.    local = MAKEP(Lseg, 0);
  40.    progid = local->pidCurrent;
  41.    sprintf(fmt, "Process %d: %%s\n", progid);   /* create format string */
  42.    printf(fmt, "Parent process started");
  43.                               /* Create the Q */
  44.    err = DosCreateQueue(&Qhan, 2, Qname);
  45.    if (err) errmsg ("Create Q", err);     /* won't return */
  46.    printf(fmt, "Queue created");
  47.                               /* Allocate shared memory */
  48.    #define NamedLen 8000
  49.    err = DosAllocShrSeg(NamedLen, Mname, &NamedSeg);
  50.    if (err) errmsg("Alloc Share", err);
  51.    err = DosSubSet(NamedSeg, 1, NamedLen);
  52.    if (err) errmsg("Sub Set", err);
  53.    printf(fmt, "Named shared memory allocated");
  54. /******************************************************************
  55.   EXEC a child process, passing names of Q & memory.
  56.   Continue reading until child passes termination value.
  57.  ******************************************************************/
  58.    strcpy(args.arg0, Pname);        /* build arg string */
  59.    strcpy(args.arg1, Qname);
  60.    args.arg1[sizeof(Qname)-1] = ' ';
  61.    strcpy(args.arg2, Mname);
  62.    err = DosExecPgm(missing,           /* buffer for missing name */ 
  63.                     sizeof(missing),   /* its length */
  64.                     EXEC_ASYNC,        /* don't wait for child */
  65.                     &args, 0L,         /* args, same environment */
  66.                     &results,          /* place for returned values */
  67.                     Pname);            /* name of program */
  68.    if (err) errmsg("Exec", err);
  69.    while (Qread())  {
  70.       printf(fmt, "Press return to continue\n");
  71.       fgetchar();
  72.    }
  73.    DosCloseQueue(Qhan);
  74.    printf(fmt, "Good-bye from parent process");
  75. }
  76. /******************************************************************
  77.    QREAD(): Read from Q, with wait; determine message type, display
  78.  ******************************************************************/
  79. Qread()
  80. {
  81.    struct {
  82.       PID    writer;          /* ID of writing process */
  83.       int    type;            /* event ID = type of ptr to Q item: */
  84.    } Qid;
  85.    union {
  86.       char far *msg;          /* pointer to received message */
  87.       long     value;         /* value if item not a pointer */
  88.    } Qitem;
  89.    SEL   msgseg;              /* segment of message */
  90.    USHORT msgoff;             /* offset of message  */
  91.    char far *Qtext;           /* pointer to message text */
  92.    int   msglen;              /* other element components */
  93.    char  msgprio;
  94.    err = DosReadQueue(Qhan, &Qid, 
  95.                       &msglen, &Qitem, 
  96.                       0,            /* read item at head of Q */
  97.                       DCWW_WAIT,    /* wait if Q empty        */
  98.                       &msgprio,     /* priority of item */
  99.                       0L);          /* no semaphore ID  */
  100.    if (err) errmsg("Read Q", err);
  101.    printf(fmt, "Read Q item:");
  102.    printf("    from Process %d\n", Qid.writer);
  103.    printf("    pointer type %d\n", Qid.type);
  104.    printf("    priority     %d\n", (int) msgprio);
  105.    printf("    length       %d\n", msglen);
  106.    switch (Qid.type)  {
  107.       case I_NUM:  {
  108.          printf("    Long value   %ld\n", Qitem.value);
  109.          return (0);
  110.       }
  111.       case I_NAME:  {
  112.          msgoff = OFFSETOF(Qitem.msg);
  113.          Qtext = MAKEP(NamedSeg, msgoff);
  114.          printf("    Message text:\n%s\n\n",  Qtext);
  115.          err = DosSubFree(NamedSeg, msgoff, msglen);
  116.          if (err) errmsg("Sub Free", err);
  117.          break;
  118.       }
  119.       case I_OWN:  {
  120.          printf("    Message text:\n%s\n\n",  Qitem.msg);
  121.          DosFreeSeg(SELECTOROF(Qitem.msg) );
  122.          break;
  123.       }
  124.       case I_DISJ:  {
  125.          msgseg = SELECTOROF(Qitem.msg);
  126.          err = DosGetSeg(msgseg);
  127.          if (err) errmsg("Get Seg", err);
  128.          printf("    Message text:\n%s\n\n",  Qitem.msg);
  129.          DosFreeSeg(msgseg);
  130.       }
  131.    }                          /* end of switch */
  132.    return (Qid.type);
  133. }
  134. /******************************************************************
  135.    ERRMSG: Print error message, terminate process 
  136.  ******************************************************************/
  137. errmsg( char *func, USHORT err)
  138. {
  139.    printf("Process %d: Error %d in %s", progid, err, func);
  140.    DosCloseQueue(Qhan);
  141.    exit(1);
  142. }
  143.