Lecture Notes for Client-Server Interfaces

25 February 2003 - Process-Based Concurrency


Processed-Based Concurrency


Iterative Stream Server Architecture

void 
its(inet_addr ina, port_no pno)

  skt l = tcp_listener(ina, pno)

  while (true)
    skt c = accept(l)

    msg m
    while read_msg(c, m)
      write_msg(c, reply(m))

    close(c)


Process-Concurrent Stream Server Architecture

void pts(inet_addr ina, port_no pno)
  
  skt s = tcp_listener(ina, pno)

  while true
    skt c = accept(s)

    switch fork()

      case 0
	close(s)

	msg m
	while read_msg(c, m)
	  write_msg(c, reply(m))

	close(c)
	break

      case -1
	perror("fork() failed")
	exit(EXIT_FAILURE)

      default
	close(c)


Parent-Child Synchronization


A Little More Synchronization


Run-Away Process Creation


Iterative Datagram Server Architecture

void ius(inet_addr ina, port_no pno)

  skt s = udp_socket(ina, pno)
  msg m
  end_point sender

  while read_msg(s, m, sender)
    write_msg(s, reply(m), sender)


Process-Concurrent Datagram Server Architecture

void pus(inet_addr ina, port_no pno)

  skt s = udp_socket(ina, pno)
  msg m
  end_point sender

  signal(SIGCHLD, reaper)

  while read_msg(s, m, sender)
    switch fork()
      case 0
	write_msg(s, reply(m), sender)
	close(s)
	exit(EXIT_SUCCESS)

      case -1
	perror("fork() failed")
	exit(EXIT_FAILURE)

  close(s)


This page last modified on 3 March 2003.