'''[http://cs.lmu.edu/~ray/notes/messagepassing/%|%Message passing]''' refers to the messages that information systems pass among themselves in a [concurrency concepts%|%concurrent] system, achieving thereby some kind of [distributed computation]. Message passing systems use some form of [IPC%|%inter-process communication] provided by the platform. ** Further Reading ** [http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm%|%Architectural Styles and the Design of Network-based Software Architectures], Roy Thomas Fielding, 2000: A great overview of approaches to software design based on message passing. It proposes [REST] as another approach. ** Description ** In message-passing systems, one system makes a request, and another provides a response. The requestor is called the '''client''', and the responder is called theer '''server'''. These roles exists even in [peer to peer%|%peer-to-peer] systems, where the participants take on one role or the other for the duration of the conversation. ** Tools ** [irc]: [vkvalli]: A simple chat server and chat client library can be used for message passing . There are quite a few chat server and client implementations in this wiki. It seems to be suitable candidate for simple coordination among processes with messages. But generally people miss it when they look for IPC mechanisms. [A Thread-Safe Message Queue]: [Spread]: Provides a high-performance messaging service that is resilient to faults across external or internal networks. [Tuplespace]: A generic term for what was called at Yale a Lindaspace. ** Applications ** [RPC]: Conversations dressed up as procedures. [remote interpreter]: In the Tcl world, communicating with remote interpreters is a particularly effective and satisfying activity. ** Example: File Signaling Between Two Processes ** [RS]: A simple file signalling between two processes, that both have write access to the same directory (but could run on different boxes and OSes, like Unix and WinNT), can look like this: ====== proc fsignal {cmd name {msg {}}} { switch $cmd { send { set fp [open $name.sig w] if {[string length $msg]} {puts $fp $msg} close $fp } wait { while 1 { if {[file exists $name.sig]} { set fp [open $name.sig] set msg [read $fp] close $fp file delete $name.sig break } else {after 100} } } } set msg ;# return the message from sender in both cases } # process 1: (when conditions are ripe) fsignal send Go 42 # process 2: (before the real action) set Magic [fsignal wait Go] ====== See also [filewait] for a related scriptlet. <> distributed computation