home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / pctech / pctj1288.arc / QDEMO2.C < prev   
Text File  |  1988-10-17  |  6KB  |  119 lines

  1. /* QDEMO2.C - Child 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 text1[] = "This message written into a named shared segment";
  14. char text2[] = "This message written into owner's segment";
  15. char text3[] = "This message written into disjoint address space";
  16. char fmt[20];        /* Format string for progress messages */
  17.  
  18. SEL   SharedSeg;           /* selector for shared memory */
  19. HQUEUE Qhan;               /* handle of queue       */
  20. int   err;
  21. PID   progid;              /* process ID of this program */
  22.  
  23. main(int argc, char **argv)
  24. {
  25.    LINFOSEG far *local;       /* ptr to Local Info seg */
  26.    SEL   Gseg, Lseg;          /* selectors for info segs*/
  27.    PID   owner;               /* process ID of Q owner */
  28.    USHORT offs;               /* offset portion of far pointer */
  29.    USHORT items;              /* count of items in Q */
  30.    char far *outmsg;          /* pointer to Q message */
  31. /******************************************************************
  32.    INITIALIZE:  open the Q. 
  33.  ******************************************************************/
  34.    DosGetInfoSeg(&Gseg, &Lseg);   /* get info segments */
  35.    local = MAKEP(Lseg, 0);
  36.    progid = local->pidCurrent;
  37.    sprintf(fmt, "Process %d: %%s\n", progid);   /* create format string */
  38.    printf(fmt, "Child process started; Args: (Q, Memory)");
  39.    if (argc < 3)  {
  40.       printf(fmt, "Too few parameters");
  41.       exit(1);
  42.    } else {
  43.       printf(fmt, argv[1]);
  44.       printf(fmt, argv[2]);
  45.    }
  46.    err = DosOpenQueue(&owner, &Qhan, argv[1]);
  47.    if (err) errmsg("Open Q", err);
  48.    printf(fmt, "Press return to continue\n");
  49.    fgetchar();
  50. /******************************************************************
  51.    WRITE Q ITEM IN NAMED MEMORY 
  52.  ******************************************************************/
  53.    err = DosGetShrSeg(argv[2], &SharedSeg);
  54.    if (err) errmsg("Get Shared Memory", err);
  55.    err = DosSubAlloc(SharedSeg, &offs, sizeof(text1));
  56.    if (err) errmsg("Sub Alloc", err);
  57.    outmsg = MAKEP(SharedSeg, offs);
  58.    strcpy(outmsg, text1);
  59.    err = DosWriteQueue(Qhan, I_NAME,      /* msg in named memory */
  60.                        sizeof(text1),     /* msg length */
  61.                        outmsg, 11);       /* address & priority  */
  62.    if (err) errmsg("Write Q, Named memory", err); 
  63.    printf(fmt, "Message in Named memory written to Q");
  64. /******************************************************************
  65.    WRITE Q ITEM IN MEMORY GIVEN TO OWNER
  66.  ******************************************************************/
  67.    err = DosAllocSeg(sizeof(text2), &SharedSeg, SEG_GIVEABLE);
  68.    if (err) errmsg("Alloc Giveable", err);
  69.    outmsg = MAKEP(SharedSeg, 0);
  70.    strcpy(outmsg, text2);
  71.    err = DosGiveSeg(SharedSeg, owner, &Gseg);
  72.    if (err) errmsg("Give Seg", err);
  73.    outmsg = MAKEP(Gseg, 0);
  74.    err = DosWriteQueue(Qhan, I_OWN,       /* msg in given memory */
  75.                        sizeof(text2),     /* msg length */
  76.                        outmsg, 11);       /* address & priority  */
  77.    if (err) errmsg("Write Q, Givable memory", err); 
  78.    printf(fmt, "Message in Givable memory written to Q");
  79.    DosFreeSeg(SharedSeg);
  80. /******************************************************************
  81.    WRITE Q ITEM IN MEMORY OWNER WILL GET
  82.  ******************************************************************/
  83.    err = DosAllocSeg(sizeof(text3), &SharedSeg, SEG_GETTABLE);
  84.    if (err) errmsg("Alloc Gettable", err);
  85.    outmsg = MAKEP(SharedSeg, 0);
  86.    strcpy(outmsg, text3);
  87.    err = DosWriteQueue(Qhan, I_DISJ,     /* msg in gettable memory */
  88.                        sizeof(text3),    /* msg length */
  89.                        outmsg, 11);      /* address, priority   */
  90.    if (err) errmsg("Write Q, Gettable memory", err); 
  91.    printf(fmt, "Message in Gettable memory written to Q");
  92. /******************************************************************
  93.    WRITE A NUMERIC VALUE
  94.  ******************************************************************/
  95.    err = DosWriteQueue(Qhan, I_NUM, /* msg is a number */
  96.                        1234,        /* can be anything */
  97.                        87654321L,   /* value in lieue of address */
  98.                        11);         /* priority */
  99.    if (err) errmsg("Write Q, Value", err);
  100.    printf(fmt, "Value written to Q");
  101. /******************************************************************
  102.    CHECK THAT ITEM IN GETTABLE MEMORY HAS BEEN READ, THEN EXIT
  103.  ******************************************************************/
  104.    items = 1;
  105.    while (items >= 1 && !err) {
  106.       DosSleep(100L);
  107.       err = DosQueryQueue(Qhan, &items);
  108.    }
  109.    printf(fmt, "Good-bye from child process");
  110. }
  111. /******************************************************************
  112.    ERRMSG: Print error message, terminate process 
  113.  ******************************************************************/
  114. errmsg(char *func, USHORT err)
  115. {
  116.    printf("Process %d: Error %d in %s", progid, err, func);
  117.    exit(1);
  118. }
  119.