home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tests / benchmarks / udgback.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-05-06  |  1.7 KB  |  86 lines

  1. /*
  2.  * IPC benchmark,
  3.  * read and reply using UNIX domain datagram sockets.
  4.  *
  5.  * Process forks and exchanges messages using a
  6.  * UNIX domain datagram socket in a request-response fashion.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <signal.h>
  11.  
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <sys/time.h>
  15. #include <sys/un.h>
  16. #include <sys/resource.h>
  17.  
  18. struct    sockaddr_un sun;
  19. struct    sockaddr_un myname;
  20.  
  21. int    catchsig();
  22. char    *malloc();
  23.  
  24. main(argc, argv)
  25.     char *argv[];
  26. {
  27.     register char *buf;
  28.     register int i, msgs = 0;
  29.     int msglen = 0, ms;
  30.     int pid, s, sunlen;
  31.  
  32.     if (argc < 3) {
  33.         printf("usage: %s #msgs msglen\n", argv[0]);
  34.         exit(1);
  35.     }
  36.     msgs = atoi(argv[1]);
  37.     msglen = atoi(argv[2]);
  38.     buf = malloc(msglen);
  39.     if (buf == 0) {
  40.         printf("Couldn't allocate data buffer\n");
  41.         exit(1);
  42.     }
  43.     myname.sun_family = AF_UNIX;
  44.     signal(SIGINT, catchsig);
  45.     s = socket(AF_UNIX, SOCK_DGRAM, 0);
  46.     if (s < 0) {
  47.         perror("socket");
  48.         exit(1);
  49.     }
  50.     sprintf(myname.sun_path, "unixdg%d", getpid());
  51.     sunlen = strlen(myname.sun_path) + 2;
  52.     if (bind(s, &myname, sunlen) < 0) {
  53.         perror("bind");
  54.         exit(1);
  55.     }
  56.     pid = fork();
  57.     if (pid == 0)
  58.         for (i = 0; i < msgs; i++) {
  59.             sunlen = sizeof (sun);
  60.             if (recvfrom(s, buf, msglen, 0, &sun, &sunlen) < 0)
  61.                 perror("recvfrom (child)");
  62.             sunlen = strlen(myname.sun_path) + 2;
  63.             if (sendto(s, buf, msglen, 0, &myname, sunlen) < 0)
  64.                 perror("sendto (child)");
  65.         }
  66.     else
  67.         for (i = 0; i < msgs; i++) {
  68.             sunlen = strlen(myname.sun_path) + 2;
  69.             if (sendto(s, buf, msglen, 0, &myname, sunlen) < 0)
  70.                 perror("sendto (parent)");
  71.             sunlen = sizeof (sun);
  72.             if (recvfrom(s, buf, msglen, 0, &sun, &sunlen) < 0)
  73.                 perror("recvfrom (parent)");
  74.         }
  75.     close(s);
  76.     unlink(myname.sun_path);
  77. }
  78.  
  79. catchsig(s)
  80.     int s;
  81. {
  82.  
  83.     unlink(myname.sun_path);
  84.     exit(1);
  85. }
  86.