BS1 WS19/20 – topic-based slides Interprocess Communication

Pipes () • Sockets (UNIX) • (UNIX) • Anonymous Pipes (Windows) • Named Pipes (Windows) • Mailslots (Windows) • Windows vs. UNIX •

2 Inter- Communication (IPC)

● Process resources are isolated by the ● IPC requires exceptions to the isolation ● Provided as kernel primitives

● Naïve Idea: Channel with Input & Output ends – “Pipe”

Operating Systems 21 UNIX – Pipes

● Unidirectional, unstructured communication channel ● Reading and Writing ends are -like ● API: read / write ● Backed by a kernel buffer ● read call blocks while the buffer is empty ● write call blocks while the buffer is full ● Indicated in shell programming by the pipe symbol (‘|’) ● Used to chain processes input and output – ` | less’

Operating Systems 22 UNIX – Pipes

● pipe() creates a set of two file int fd[2]; descriptors ● File descriptors are inherited // fd[0] is for reading by child processes after fork() // fd[1] is for writing ● Example: write a program pipe(fd); that starts two given programs in child processes and connects them in a pipe

Operating Systems 23 UNIX – Named Pipes (FIFOs)

● FIFOs are pipes that are represented in the ● Need to be open()’ed to produce a ● Otherwise behave similarly ● Persist outside of a process scope

mknod("myfifo", S_IFIFO | 0644 , 0); mkfifo [OPTION]... NAME...

● No concept of “connections”

Operating Systems 24 UNIX – Sockets

● Network Sockets ● represented by network address (IP, Port) ● Local Domain Sockets ● represented by path in file system

● Connection-oriented (TCP) (bind / listen / accept) ● Bidirectional, indicative of a client / server architecture ● Bound to a listening process Operating Systems 25 UNIX – Shared Memory

● Processes can share memory explicitly int shm_open(const char *name, int oflag, mode_t mode)

● Shared memory segments are a named resource ● Represented within process resources through file descriptor ● Can be mapped to process address space using ● Access has to be synchronized (critical sections)

Operating Systems 26 Windows – Anonymous Pipes

Half-duplex character-based IPC BOOL CreatePipe( PHANDLE phRead, ● cbPipe: pipe buffer size in bytes; PHANDLE phWrite, zero == default LPSECURITY_ATTRIBUTES lpsa, DWORD cbPipe ) ● Read operation on empty pipe will block ● Write operation to a full pipe will block main ● Anonymous pipes are oneway

prog1 pipe prog2 ● Example: $ date | more Operating Systems 27 I/O Redirection using an

/* Create default size anonymous pipe, handles are inheritable. */ if (!CreatePipe (&hReadPipe, &hWritePipe, &PipeSA, 0)) { fprintf(stderr, “Anon pipe create failed\n”); exit(1); } /* Set output handle to pipe handle, create first processes. */ StartInfoCh1.hStdInput = GetStdHandle (STD_INPUT_HANDLE); StartInfoCh1.hStdError = GetStdHandle (STD_ERROR_HANDLE); StartInfoCh1.hStdOutput = hWritePipe; StartInfoCh1.dwFlags = STARTF_USESTDHANDLES;

if (!CreateProcess (NULL, (LPTSTR)Command1, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfoCh1, &ProcInfo1)) { fprintf(stderr, “CreateProc1 failed\n”); exit(2); } CloseHandle (hWritePipe);

Operating Systems 28 I/O Redirection using an Anonymous Pipe

/* Repeat (symmetrically) for the second process. */ StartInfoCh2.hStdInput = hReadPipe; StartInfoCh2.hStdError = GetStdHandle (STD_ERROR_HANDLE); StartInfoCh2.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE); StartInfoCh2.dwFlags = STARTF_USESTDHANDLES;

if (!CreateProcess (NULL, (LPTSTR)targv, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfoCh2, &ProcInfo2)) { fprintf(stderr, “CreateProc2 failed\n”); exit(3); } CloseHandle (hReadPipe);

/* Wait for both processes to complete. */ WaitForSingleObject (ProcInfo1.hProcess, INFINITE); WaitForSingleObject (ProcInfo2.hProcess, INFINITE); CloseHandle (ProcInfo1.hThread); CloseHandle (ProcInfo1.hProcess); CloseHandle (ProcInfo2.hThread); CloseHandle (ProcInfo2.hProcess); return 0; Operating Systems 29 Windows – Named Pipes

● Message oriented ● Reading process can read varying-length messages precisely as sent by the writing process ● Bi-directional ● Two processes can exchange messages over the same pipe ● Multiple, independent instances of a : ● Several clients can communicate with a single server using the same instance ● Server can respond to client using the same instance ● Pipe can be accessed over the network ● location transparency ● Convenience and connection functions Operating Systems 30 Using Windows Named Pipes HANDLE CreateNamedPipe (LPCTSTR lpszPipeName, DWORD fdwOpenMode, DWORD fdwPipMode DWORD nMaxInstances, DWORD cbOutBuf, DWORD cbInBuf, DWORD dwTimeOut, LPSECURITY_ATTRIBUTES lpsa );

● lpszPipeName: \\.\pipe\[path]pipename ● Not possible to create a pipe on remote machine (. – local machine) ● FdwOpenMode: PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND ● fdwPipeMode: ● PIPE_TYPE_BYTE or PIPE_TYPE_MESSAGE ● PIPE_READMODE_BYTE or PIPE_READMODE_MESSAGE ● PIPE_WAIT or PIPE_NOWAIT (will ReadFile block?)

Operating Systems 31 Using Windows Named Pipes

● nMaxInstances: ● Number of instances, ● PIPE_UNLIMITED_INSTANCES: OS choice based on resources ● dwTimeOut ● Default time-out period (in msec) for WaitNamedPipe() ● First CreateNamedPipe creates named pipe ● Closing handle to last instance deletes named pipe ● Polling a pipe: ● Nondestructive – is there a message waiting for ReadFile

BOOL PeekNamedPipe (HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer, LPDWORD lpcbRead, LPDWORD lpcbAvail, LPDWORD lpcbMessage);Operating Systems 32 Using Windows Named Pipes

● CreateFile with named pipe name: ● Local: \\.\pipe\[path]pipename ● Remote: \\servername\pipe\[path]pipename ● Status Functions: ● GetNamedPipeHandleState(...) ● SetNamedPipeHandleState(...) ● GetNamedPipeInfo(...)

Operating Systems 33 Convenience Functions

● WriteFile / ReadFile sequence:

BOOL TransactNamedPipe( HANDLE hNamedPipe, LPVOID lpvWriteBuf, DWORD cbWriteBuf, LPVOID lpvReadBuf, DWORD cbReadBuf, LPDOWRD lpcbRead, LPOVERLAPPED lpa);

● CreateFile / WriteFile / ReadFile / CloseHandle: ● dwTimeOut: NMPWAIT_NOWAIT, NMPWAIT_WIAT_FOREVER, NMPWAIT_USE_DEFAULT_WAIT

BOOL CallNamedPipe( LPCTSTR lpszPipeName, LPVOID lpvWriteBuf, DWORD cbWriteBuf, LPVOID lpvReadBuf, DWORD cbReadBuf, LPDWORD lpcbRead,Operating SystemsDWORD dwTimeOut); 34 Server: eliminate the polling loop

BOOL ConnectNamedPipe (HANDLE hNamedPipe, LPOVERLAPPED lpo );

● lpo == NULL: ● Call will return as soon as there is a client connection ● Returns false if client connected between CreateNamed Pipe call and ConnectNamedPipe() ● Use DisconnectNamedPipe to free the handle for connection from another client ● WaitNamedPipe(): ● Client may wait for server‘s ConnectNamedPipe() ● Security rights for named pipes: ● GENERIC_READ, GENERIC_WRITE, SYNCHRONIZE

Operating Systems 35 Client Example using a Named Pipe

WaitNamedPipe (ServerPipeName, NMPWAIT_WAIT_FOREVER); hNamedPipe = CreateFile (ServerPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hNamedPipe == INVALID_HANDLE_VALUE) { fptinf(stderr, “Failure to locate server.\n"); exit(3); } /* Write the request. */ WriteFile (hNamedPipe, &Request, MAX_RQRS_LEN, &nWrite, NULL);

/* Read each response and send it to std out. */ while (ReadFile (hNamedPipe, Response.Record, MAX_RQRS_LEN, &nRead, NULL)) printf ("%s", Response.Record);

CloseHandle (hNamedPipe); return 0;

Operating Systems 36 Server Example Using a Named Pipe

hNamedPipe = CreateNamedPipe (SERVER_PIPE, PIPE_ACCESS_DUPLEX, PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, 0, 0, CS_TIMEOUT, pNPSA); while (!Done) { printf ("Server is awaiting next request.\n"); if (!ConnectNamedPipe (hNamedPipe, NULL) || !ReadFile (hNamedPipe, &Request, RQ_SIZE, &nXfer, NULL)) { fprintf(stderr, “Connect or Read Named Pipe error\n”); exit(4); } printf(“Request is: %s\n", Request.Record); /* Send the file, one line at a time, to the client. */ fp = fopen (File, "r"); while ((fgets (Response.Record, MAX_RQRS_LEN, fp) != NULL)) WriteFile (hNamedPipe, &Response.Record, (strlen(Response.Record) + 1) * TSIZE, &nXfer, NULL); fclose (fp); DisconnectNamedPipe (hNamedPipe); } /* End of server operation. */

Operating Systems 37 UNIX vs. Windows

● UNIX FIFOs are similar to Windows Named Pipe ● FIFOs are half-duplex ● FIFOs are limited to a single machine ● FIFOs are byte-oriented; fixed-size records in client/server applications ● Individual read/writes are atomic; serialized by the kernel ● A server using FIFOs must use a separate FIFO for each client‘s response, although all clients can send requests via a single, well known FIFO ● Mkfifo() is the UNIX counterpart to CreateNamedPipe() ● Use sockets for networked client/server scenarios

Operating Systems 38 Windows – Mailslots

● Broadcast mechanism: ● One-directional; unreliable ● Mutliple writers/multiple readers (frequently: one-to-many .) ● Can be located over a network domain ● Message lengths are limited (w2k: < 426 byte) ● Operations on the mailslot: ● Each reader (server) creates mailslot with CreateMailslot() ● Write-only client opens mailslot with CreateFile() and uses WriteFile() – open will fail if there are no waiting readers ● Client‘s message can be read by all servers (readers) ● Client lookup: \\*\mailslot\mailslotname ● Client will connect to every server in network domain ● Mailslots bear some nasty implementation details; they are almost never used

Operating Systems 39 Locate a server via mailslot

Mailslot Servers Mailslot Client App client 0 Message is sent periodically hMS = CreateMailslot( App Server “\\.\mailslot\status“); While (...) { ReadFile(hMS, &ServStat); (...); /* connect to server */ hMS = CreateFile( “\\*\mailslot\status“); ... WriteFile(hMS, &StatInfo App client n } hMS = CreateMailslot( “\\.\mailslot\status“); ReadFile(hMS, &ServStat); /* connect to server */

Operating Systems 40 Creating a mailslot

HANDLE CreateMailslot(LPCTSTR lpszName, DWORD cbMaxMsg, DWORD dwReadTimeout, LPSECURITY_ATTRIBUTES lpsa);

● lpszName points to a name of the form ● \\.\mailslot\[path]name ● Name must be unique; mailslot is created locally ● cbMaxMsg is msg size in byte ● dwReadTimeout ● Read operation will wait for so many msec ● 0 – immediate return ● MAILSLOT_WAIT_FOREVER – infinite wait

Operating Systems 41 Opening a mailslot

● CreateFile with the following names: ● \\.\mailslot\[path]name - retrieve handle for local mailslot ● \\host\mailslot\[path]name - retrieve handle for mailslot on specified host ● \\domain\mailslot\[path]name - returns handle representing all mailslots on machines in the domain ● \\*\mailslot\[path]name - returns handle representing mailslots on machines in the system‘s primary domain: max mesg. len: 400 bytes ● Client must specifiy FILE_SHARE_READ flag ● GetMailslotInfo() and SetMailslotInfo() are similar to their named pipe counterparts

Operating Systems 42