/* 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 5a. Example of a port being shared between processes Compile with Sun Studio 9: cc -o port_sendfd listing5a_user.c Compile with gcc 3.4.1: gcc -o port_sendfd listing5a_user.c Usage: ./port_sendfd <# of user events> Usage example: `bash-2.05b$ ./port_sendfd 10 & sleep 4; ./port_rcvfd 10 10` */ #include #include #include #include #include #include #include #include #include #include #define PORT_FILE "/tmp/port_attach" int main(int argc, char *argv[]){ int port; int number_of_user_events = 0; int ret; int fd; void *userp = (void *)0xdeadbeef; if(argv[1] != NULL) number_of_user_events = atoi(argv[1]); if(argc != 2 || number_of_user_events < 1){ printf("Usage: %s <# of user events>\n", argv[0]); exit(-1); } ret = mkfifo(PORT_FILE, S_IRWXU | S_IRWXG | S_IRWXO); if(ret){ perror("mkfifo failed [mkfifo(3C)] "); return (-1); } /* Create event port */ port = port_create(); if(port == -1){ perror("Cannot create port [port_create(3C)] "); return (-1); } fd = open(PORT_FILE, O_RDWR); if(fd == -1){ perror("Cannot open pipe [open(2)] "); return(-1); } ret = ioctl(fd, I_SENDFD, port); if(ret < 0){ printf("I_SENDFD failed\n"); return (-1); } printf("parent: send %d user-defined events\n", number_of_user_events); int counter; for(counter = 0;counter < number_of_user_events; counter++){ printf("parent: port_send(%d, %d, 0x%x)\n", port, counter, userp); ret = port_send(port, counter, userp); if(ret == -1){ perror("Failed to send a user defined payload [port_send(3C)] "); ret = close(port); if(ret == -1){ perror("Failed to close a port [close(2)] "); } return (-1); } } printf("parent: wait 5 seconds and close everything ...\n"); sleep(5); unlink(PORT_FILE); close(port); }