/* Copyright 2004 Sun Microsystems, Inc. ALL RIGHTS RESERVED Use of this software is authorized pursuant to the terms of the license found at http://developers.sun.com/berkeley_license.html Listing 4. Example of using a port to send a user defined payload Compile with Sun Studio 9: cc -o port_send listing4_user.c Compile with gcc 3.4.1: gcc -o port_send listing4_user.c Usage: ./port_send Usage example: ./port_send 1 */ #include #include #include #include struct user_payload{ char* message; pid_t process_id; hrtime_t start; }; int main(int argc, char *argv[]){ int ret; int port; int events = 0; int loop; struct user_payload payload_test; port_event_t pev; struct timespec timeout; hrtime_t end; if(argv[1] != NULL) events = atoi(argv[1]); if(argc != 2 || events < 1){ printf("Usage: %s \n", argv[0]); exit(-1); } /* Create worker port */ port = port_create(); if(port == -1){ perror("Cannot create port [port_create(3C)]: "); return (-1); } payload_test.message = "Hello World"; payload_test.process_id = getpid(); payload_test.start = gethrtime(); /* Send user defined event */ ret = port_send(port, events, &payload_test); if(ret != 0){ perror("port_send failed [port_send(3C)]: "); ret = close(port); return (-1); } timeout.tv_sec = 4; timeout.tv_nsec = 0; /* Reap event */ ret = port_get(port, &pev, &timeout); end = gethrtime(); if(ret == -1){ perror("Failed to reap events [port_get(3C)]: "); return(-1); } printf("\nEvent detected:\n"); printf("\t source = %d\n", pev.portev_source); printf("\t object = %x\n", pev.portev_object); printf("\t event = 0x%x when the specified event = 0x%x (%d)\n", pev.portev_events, events, events); printf("\t user payload:\n"); printf("\t\t process id = %d\n", ((struct user_payload*)(pev.portev_user))->process_id); printf("\t\t user message = %s\n", ((struct user_payload*)(pev.portev_user))->message ); printf("\t\t duration of timer = %lld nsec\n", (end - ((struct user_payload*)(pev.portev_user))->start)); close(port); }