Annotation of os2sdk/demos/examples/pipes/pipes.c, revision 1.1

1.1     ! root        1: /***   pipes.c - parent program
        !             2:  *
        !             3:  *     Example of DOSMAKEPIPE usage in parent/child communication
        !             4:  *
        !             5:  *     This program gets some shared memory, makes a pipe, writes
        !             6:  *     a string into it, and then execs a child.  The child gets
        !             7:  *     the shared memory segment, then reads from the pipe using
        !             8:  *     the handle passed in the shared memory segment.
        !             9:  */
        !            10: #include <stdio.h>
        !            11: #include <doscalls.h>
        !            12: 
        !            13: typedef struct {                       /* structure of shared mem segment */
        !            14:        unsigned read_handle;           /* pipe read handle */
        !            15:        unsigned write_handle;          /* pipe write handle */
        !            16: } SharedData;
        !            17: 
        !            18: SharedData far *fp;                    /* pointer to shared memory */
        !            19: unsigned mem_handle;                   /* selector of the allocated segment */
        !            20: 
        !            21: 
        !            22: main()
        !            23: {
        !            24: 
        !            25:        static char pname[] = "\\SHAREMEM\\public";        /* shared mem name */
        !            26:        static char writeout[] = "Writing to the child";   /* pipe string */
        !            27:        char exec_buf[100];             /* buffer for DosExecPgm ObjName */
        !            28:        char *pgmname = "pchild.exe";   /* name of child program */
        !            29:        int i;
        !            30:        int retcode;                    /* holds return code from call */
        !            31:        struct ResultCodes tcodes;      /* termination codes from DosExecPgm */
        !            32:        unsigned far *fpinit;           /* pointer to shared memory */
        !            33:        unsigned buflen;                /* DosWrite buffer length */
        !            34:        unsigned memsiz = 1024;         /* size of memory segment requested */
        !            35:        unsigned pipe_size;             /* size to reserve for the pipe */
        !            36:        unsigned written;               /* number bytes written by DosWrite */
        !            37: 
        !            38:        /* allocate 1k shared memory segment and initialize it */
        !            39:        printf("Getting shared memory segment\n");
        !            40:        retcode = DOSALLOCSHRSEG( memsiz, (char far *)pname,
        !            41:                        (unsigned far *)&mem_handle);
        !            42: 
        !            43:        /* create pointers to shared memory segment */
        !            44:        fp = (SharedData far *)(((unsigned long)mem_handle << 16) | 0);
        !            45:        fpinit = (unsigned far *)(((unsigned long)mem_handle << 16) | 0);
        !            46: 
        !            47:        /* zero initialize the segment */
        !            48:        for (i = 0; i < memsiz / 2; i++) {
        !            49:            *fpinit = 0;
        !            50:            fpinit++;
        !            51:        }
        !            52: 
        !            53:        /* make the pipe */
        !            54:        pipe_size = 0;                  /* use default size */
        !            55:        printf("Making the pipe\n");
        !            56:        retcode = DOSMAKEPIPE((unsigned far *)&fp->read_handle,
        !            57:                        (unsigned far *)&fp->write_handle, pipe_size);
        !            58: 
        !            59:        if ( retcode ) {
        !            60:            printf("DosMakePipe returned error %d, aborting\n", retcode);
        !            61:            exit(2);
        !            62:        }
        !            63:        else
        !            64:            printf("DosMakePipe retcode %d, read_handle %d, write_handle %d\n",
        !            65:                retcode, fp->read_handle, fp->write_handle);
        !            66: 
        !            67:         /* write string to pipe */
        !            68:        buflen = strlen(writeout) + 1;
        !            69:        if( retcode = DOSWRITE( fp->write_handle, (char far *)writeout,
        !            70:                        buflen, (unsigned far *)&written)) {
        !            71:                 printf("Write to pipe failed, retcode %d\n", retcode);
        !            72:                 exit(2);
        !            73:         }
        !            74:        else 
        !            75:                printf("Write to write_handle %d, bytes written %d\n",
        !            76:                    fp->write_handle, written);
        !            77:         
        !            78:         /* create the child */
        !            79:        printf("Creating child\n");
        !            80:        retcode = DOSEXECPGM( (char far *)exec_buf, 100, 0,
        !            81:                        (unsigned far *)0L,
        !            82:                        (unsigned far *)0L,
        !            83:                        (struct ResultCodes far *)&tcodes, pgmname );
        !            84: 
        !            85:        if ( retcode )
        !            86:                 printf("DosExecPgm of child error %d\n", retcode);
        !            87:        else 
        !            88:                printf("Back in parent\n");
        !            89:        
        !            90:        /* close the pipe */
        !            91:        DOSCLOSE( fp->read_handle );
        !            92:        DOSCLOSE( fp->write_handle );
        !            93: 
        !            94:        DOSEXIT(1,0);   /* Terminate, kill any dangling children */
        !            95: 
        !            96: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.