| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | /* This Hello World demostrate a simple multithread program */#include "pal.h"#include "pal_debug.h"#include "api.h"int main (int argc, char ** argv){    int nsend = 5 , i;    PAL_HANDLE handles[nsend];    if (argc == 1)  /* parent */    {        pal_printf("Parent: Executing the program\n");        const char *args[3] = { "HandleSend", "child", NULL };        char * data = "Hello World";        char content[20];        char uri[80];        PAL_HANDLE child;        int bytes;        pal_printf("Parent: Creating handles\n");        // Sending pipe handle        handles[0] = DkStreamOpen("pipe.srv:012", PAL_ACCESS_RDWR,                                  0, PAL_CREATE_TRY, 0);        if (!handles[0]) {            pal_printf("Parent: DkStreamOpen for pipe failed\n");            goto out;        }        // Sending pipe handle        handles[1] = DkStreamOpen("udp:127.0.0.1:8000", PAL_ACCESS_RDWR,                                  0, PAL_CREATE_TRY, 0);        if (!handles[1]) {            pal_printf("Parent: DkStreamOpen for socket failed\n");            goto out;        }        for (i = 2 ; i < nsend; i++) {            snprintf(uri, 80, "file:test_file_%d", i - 2);            handles[i] = DkStreamOpen(uri, PAL_ACCESS_RDWR, 0600,                                      PAL_CREATE_TRY, 0);            if (!handles[i]) {                pal_printf("Parent: DkStreamOpen failed\n");                goto out;            }            DkStreamSetLength(handles[i], 0);        }        for (i = 0 ; i < nsend ; i++) {            /* do some write */            snprintf(content, sizeof(content), "%s%d", data, i);            bytes = DkStreamWrite(handles[i], 0, sizeof(content), content,                                  NULL);            if (!bytes) {                pal_printf("Parent: DKStreamWrite failed\n");                goto out;            }            DkStreamFlush(handles[i]);        }        pal_printf("Parent: Forking child\n");        child = DkProcessCreate ("file:HandleSend", args);        if (!child) {            pal_printf("Parent: Failed creating process\n");            DkProcessExit(1);        }        for (i = 0 ; i < nsend ; i++) {            pal_printf("Parent: Sending Handle %d\n", i);            if (!DkSendHandle(child, handles[i])) {                pal_printf("Send handle failed\n");                goto out;            }            DkObjectClose(handles[i]);        }        pal_printf("Parent: Finished execution\n");        DkObjectClose(child);    }    else            /* child */    {        PAL_HANDLE parent = pal_control.parent_process;        for (i = 0 ; i < nsend ; i++) {            pal_printf("Child: Receiving Handle %d\n", i);            handles[i] = DkReceiveHandle(parent);            if (!handles[i]) {                pal_printf("Child: Failed receiving handle\n");                DkProcessExit(1);            }        }        pal_printf("Child: Reading the handles\n");        for (i = 0 ; i < nsend ; i++) {            /* do some read */            pal_printf("Child: Handle %d Type ", i);            char data[20];            switch(PAL_GET_TYPE(handles[i])) {                case pal_type_file:                    if ((DkStreamRead(handles[i], 0, 20, data, NULL, 0)))                        pal_printf("File Data: %s\n", data);                    else                        pal_printf("Couldn't read\n");                    break;                case pal_type_pipesrv:                    pal_printf("Pipe\n");                    break;                case pal_type_udp:                    pal_printf("Udp\n");                    break;                default:                    pal_printf("Unknown\n");            }            DkObjectClose(handles[i]);        }        pal_printf("Child: Finished execution\n\n");        DkObjectClose(parent);    }out:    for (i = 0 ; i < nsend ; i++)        DkObjectClose(handles[i]);    return 0;}
 |