Interprocess Communication
Total Page:16
File Type:pdf, Size:1020Kb
BS1 WS19/20 – topic-based slides Interprocess Communication Pipes (UNIX) • Sockets (UNIX) • Shared Memory (UNIX) • Anonymous Pipes (Windows) • Named Pipes (Windows) • Mailslots (Windows) • Windows vs. UNIX • 2 Inter-Process Communication (IPC) ● Process resources are isolated by the operating system ● 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 file-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 – `ls | 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 file system ● Need to be open()’ed to produce a file descriptor ● 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 mmap ● 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 Anonymous Pipe /* 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 named pipe: ● 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 comm.) ● 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