POSIX Shared Memory. Linux/UNIX IPC Programming. Outline. Michael Kerrisk, man7.org c 2017 November 2017

Similar documents
Shared Memory. By Oren Kalinsky

ECE 650 Systems Programming & Engineering. Spring 2018

Shared Memory Memory mapped files

CSCI 4061: Virtual Memory

CSC 271 Software I: Utilities and Internals

Operating systems. Lecture 9

CSE 410: Systems Programming

Inter-Process Communication. Disclaimer: some slides are adopted from the book authors slides with permission 1

Memory management. Single process. Multiple processes. How to: All memory assigned to the process Addresses defined at compile time

Interprocess Communication. Originally multiple approaches Today more standard some differences between distributions still exist

Programmation Système Cours 5 Memory Mapping

Applications of. Virtual Memory in. OS Design

CSE 333 SECTION 3. POSIX I/O Functions

Outline. Overview. Linux-specific, since kernel 2.6.0

Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

Lecture 18. Log into Linux. Copy two subdirectories in /home/hwang/cs375/lecture18/ $ cp r /home/hwang/cs375/lecture18/*.

Outline. OS Interface to Devices. System Input/Output. CSCI 4061 Introduction to Operating Systems. System I/O and Files. Instructor: Abhishek Chandra

Programmation Systèmes Cours 4 IPC: FIFO

Programmation Système Cours 4 IPC: FIFO

MMAP AND PIPE. UNIX Programming 2015 Fall by Euiseong Seo

Lab 09 - Virtual Memory

Lecture 20. Log into Linux. Copy directory /home/hwang/cs375/lecture20 Project 5 due today. Project 6 posted, due Tuesday, April 8. Questions?

Outline. Relationship between file descriptors and open files

Lecture files in /home/hwang/cs375/lecture05 on csserver.

I/O OPERATIONS. UNIX Programming 2014 Fall by Euiseong Seo

Memory Mapped I/O. Michael Jantz. Prasad Kulkarni. EECS 678 Memory Mapped I/O Lab 1

I/O OPERATIONS. UNIX Programming 2014 Fall by Euiseong Seo

Lecture 3. Introduction to Unix Systems Programming: Unix File I/O System Calls

UNIX System Calls. Sys Calls versus Library Func

CSE 333 SECTION 3. POSIX I/O Functions

Operating Systems. Lecture 06. System Calls (Exec, Open, Read, Write) Inter-process Communication in Unix/Linux (PIPE), Use of PIPE on command line

Operating Systems CMPSCI 377 Spring Mark Corner University of Massachusetts Amherst

Like select() and poll(), epoll can monitor multiple FDs epoll returns readiness information in similar manner to poll() Two main advantages:

Operating systems. Lecture 7

Introduction to File Systems. CSE 120 Winter 2001

Operating System Labs. Yuanbin Wu

Systems Programming. COSC Software Tools. Systems Programming. High-Level vs. Low-Level. High-Level vs. Low-Level.

OPERATING SYSTEMS: Lesson 2: Operating System Services

Interprocess Communication

Hyo-bong Son Computer Systems Laboratory Sungkyunkwan University

CSci 4061 Introduction to Operating Systems. File Systems: Basics

Files. Eric McCreath

Processes COMPSCI 386

Fall 2017 :: CSE 306. File Systems Basics. Nima Honarmand

CS 33. Files Part 2. CS33 Intro to Computer Systems XXI 1 Copyright 2018 Thomas W. Doeppner. All rights reserved.

Preview. System Call. System Call. System Call. System Call. Library Functions 9/20/2018. System Call

ECEN 449 Microprocessor System Design. Review of C Programming

Files and the Filesystems. Linux Files

Outline. 1 Details of paging. 2 The user-level perspective. 3 Case study: 4.4 BSD 1 / 19

Memory management. Johan Montelius KTH

ECEN 449 Microprocessor System Design. Review of C Programming. Texas A&M University

OS COMPONENTS OVERVIEW OF UNIX FILE I/O. CS124 Operating Systems Fall , Lecture 2

File Management 1/34

File Descriptors and Piping

CMPSC 311- Introduction to Systems Programming Module: Input/Output

Unix File and I/O. Outline. Storing Information. File Systems. (USP Chapters 4 and 5) Instructor: Dr. Tongping Liu

Lecture 21 Systems Programming in C

CMSC 216 Introduction to Computer Systems Lecture 17 Process Control and System-Level I/O

The course that gives CMU its Zip! I/O Nov 15, 2001

Process Creation in UNIX

CS 201. Files and I/O. Gerson Robboy Portland State University

CS C Primer. Tyler Szepesi. January 16, 2013

UNIX input and output

Inter-Process Communication

CS240: Programming in C

경희대학교컴퓨터공학과 조진성. UNIX System Programming

Signal Example 1. Signal Example 2

Intel P The course that gives CMU its Zip! P6/Linux Memory System November 1, P6 memory system. Review of abbreviations

File Systems. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

UNIT III- INTER PROCESS COMMUNICATIONS Part A

libxcpc(3) Exception and resource handling in C libxcpc(3)

Creating a Shell or Command Interperter Program CSCI411 Lab

Computer Architecture and Assembly Language. Practical Session 5

How do we define pointers? Memory allocation. Syntax. Notes. Pointers to variables. Pointers to structures. Pointers to functions. Notes.

Virtual Memory: Systems

All the scoring jobs will be done by script

Input and Output System Calls

Memory Management. Fundamentally two related, but distinct, issues. Management of logical address space resource

Multi-Process Programming in C

All the scoring jobs will be done by script

CS 3113 Introduction to Operating Systems Midterm October 11, 2018

CS 3113 Introduction to Operating Systems Midterm October 11, 2018

Systems Programming. 09. Filesystem in USErspace (FUSE) Alexander Holupirek

P6 memory system P6/Linux Memory System October 31, Overview of P6 address translation. Review of abbreviations. Topics. Symbols: ...

Physical Files and Logical Files. Opening Files. Chap 2. Fundamental File Processing Operations. File Structures. Physical file.

Outline. Basic features of BPF virtual machine

UNIX System Programming

Contents. NOTICE & Programming Assignment #1. QnA about last exercise. File IO exercise

Page Which had internal designation P5

CS631 - Advanced Programming in the UNIX Environment. Dæmon processes, System Logging, Advanced I/O

Contents. IPC (Inter-Process Communication) Representation of open files in kernel I/O redirection Anonymous Pipe Named Pipe (FIFO)

프로세스간통신 (Interprocess communication) i 숙명여대창병모

Inter-Process Communication. Disclaimer: some slides are adopted from the book authors slides with permission 1

Processes. Johan Montelius KTH

Basic OS Progamming Abstrac2ons

Intel P6 (Bob Colwell s Chip, CMU Alumni) The course that gives CMU its Zip! Memory System Case Studies November 7, 2007.

File System. Minsoo Ryu. Real-Time Computing and Communications Lab. Hanyang University.

UNIX System Programming. Overview. 1. A UNIX System. 2. Processes (review) 2.1. Context. Pipes/FIFOs

A process. the stack

User Namespaces. Linux Capabilities and Namespaces. Outline. Michael Kerrisk, man7.org c 2018 March 2018

Transcription:

Linux/UNIX IPC Programming POSIX Shared Memory Michael Kerrisk, man7.org c 2017 mtk@man7.org November 2017 Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45

Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45 Shared memory Data is exchanged by placing it in memory pages shared by multiple processes Pages are in user virtual address space of each process Process A page table Physical memory Page table entries for shared memory region Process B page table Shared memory region Pages not actually contiguous Page table entries for shared memory region Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-4 10.1

Shared memory Data transfer is not mediated by kernel User-space copy makes data visible to other processes Very fast IPC Compare with pipes and MQs: Send requires copy from user to kernel memory Receive requires copy from kernel to user memory But, need to synchronize access to shared memory E.g., to prevent simultaneous updates Commonly, semaphores are used Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-5 10.1 POSIX shared memory objects Implemented (on Linux) as files in a dedicated tmpfs filesystem tmpfs == virtual memory filesystem that employs swap space when needed Objects have kernel persistence Objects exist until explicitly deleted, or system reboots Can map an object, change its contents, and unmap Changes will be visible to next process that maps object Accessibility: user/group owner + permission mask Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-6 10.1

POSIX shared memory APIs Main APIs used with POSIX shared memory: shm_open() : Open existing shared memory (SHM) object, or Create and open new SHM object Returns a file descriptor used in later calls ftruncate() : set size of SHM object mmap() : map SHM object into caller s address space close() : close file descriptor returned by shm_open() shm_unlink() : remove SHM object name, mark for deletion once all processes have closed Compile with cc -lrt shm_overview(7) man page Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-7 10.1

Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45 Creating/opening a shared memory object: shm_open() # include < fcntl.h > /* Defines O_* constants */ # include < sys / stat.h > /* Defines mode constants */ # include <sys / mman.h> int shm_open ( const char * name, int oflag, mode_t mode ); Creates and opens a new object, or opens an existing object name: name of object (/somename) Returns file descriptor on success, or -1 on error (The close-on-exec flag is automatically set for the FD) [TLPI 54.2] Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-10 10.2

Creating/opening a shared memory object: shm_open() # include < fcntl.h > /* Defines O_* constants */ # include < sys / stat.h > /* Defines mode constants */ # include <sys / mman.h> int shm_open ( const char * name, int oflag, mode_t mode ); oflag specifies flags controlling operation of call O_CREAT: create object if it does not already exist O_EXCL: (with O_CREAT) create object exclusively Give error if object already exists O_RDONLY: open object for read-only access O_RDWR: open object for read-write access NB: No O_WRONLY flag... O_TRUNC: truncate an existing object to zero length Contents of existing object are destroyed Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-11 10.2 Creating/opening a shared memory object: shm_open() # include < fcntl.h > /* Defines O_* constants */ # include < sys / stat.h > /* Defines mode constants */ # include <sys / mman.h> int shm_open ( const char * name, int oflag, mode_t mode ); mode: permission bits for new object RWX for user / group / other ANDed against complement of process umask Required argument; specify as 0 if opening existing object Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-12 10.2

Sizing a shared memory object New SHM objects have length 0 Before mapping, must set size using ftruncate(fd, size) Bytes in newly extended object are initialized to 0 If existing object is shrunk, truncated data is lost Can obtain size of existing object using fstat() st_size field of stat structure Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-13 10.2 Mapping a shared memory object: mmap() # include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); Complex, general-purpose API for creating memory mapping in caller s virtual address space 15+ bits employed in flags See TLPI Ch. 49 and mmap(2) We consider only use with POSIX SHM In practice, only a few decisions to make Usually just length, prot, and maybe offset Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-14 10.2

Mapping a shared memory object: mmap() # include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); fd: file descriptor specifying object to map Use FD returned by shm_open() addr: address at which to place mapping in caller s virtual address space Let s look at a picture... Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-15 10.2 Process memory layout (schematically) argv, environ Stack (grows downward) High virtual address (unallocated memory) Memory mappings placed here Heap (grows upward) Uninitialized data (bss) Initialized data Te xt (program code) Low virtual address Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-16 10.2

Mapping a shared memory object: mmap() include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); addr: address at which to place mapping in caller s virtual address space But, this address may already be occupied Therefore, kernel takes addr as only a hint Ignored if address is already occupied addr == NULL let system choose address Normally use NULL for POSIX SHM objects mmap() returns address actually used for mapping Treat this like a normal C pointer On error, mmap() returns MAP_FAILED Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-17 10.2 Mapping a shared memory object: mmap() include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); length: size of mapping Normally should be size of SHM object System rounds up to multiple of system page size sysconf(_sc_pagesize) offset: starting point of mapping in underlying file or SHM object Must be multiple of system page size Commonly specified as 0 (map from start of object) Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-18 10.2

Mapping a shared memory object: mmap() include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); prot: memory protections set protection bits in page-table entries for mapping (Protections can later be changed using mprotect(2)) PROT_READ: for read-only mapping PROT_READ PROT_WRITE: for read-write mapping Must be consistent with access mode of shm_open() E.g., can t specify O_RDONLY to shm_open() and then PROT_READ PROT_WRITE for mmap() Also PROT_EXEC: contents of memory can be executed Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-19 10.2 Mapping a shared memory object: mmap() include <sys / mman.h> void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); flags: bit flags controlling behavior of call POSIX SHM objects: need only MAP_SHARED MAP_SHARED == make caller s modifications to mapped memory visible to other processes mapping same object Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-20 10.2

Example: pshm/pshm_create_simple.c./ pshm_create_simple /shm - object - name size Create a SHM object with given name and size Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-21 10.2 Example: pshm/pshm_create_simple.c 1 int fd; 2 size_t size ; 3 void * addr ; 4 size = atoi ( argv [2]); 5 fd = shm_open ( argv [1], O_CREAT O_EXCL O_RDWR, 6 S_IRUSR S_IWUSR ); 7 ftruncate (fd, size ); 8 addr = mmap ( NULL, size, PROT_READ PROT_WRITE, 9 MAP_SHARED, fd, 0); 1 SHM object created with RW permission for user, opened with read-write access mode 2 fd returned by shm_open() is used in ftruncate() + mmap() 3 Same size is used in ftruncate() + mmap() 4 mmap() not necessary, but demonstrates how it s done 5 Mapping protections PROT_READ PROT_WRITE consistent with O_RDWR access mode Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-22 10.2

Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45 Using shared memory objects Address returned by mmap() can be used just like any C pointer Usual approach: treat as pointer to some structured type Can read and modify memory via pointer [TLPI 48.6] Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-24 10.3

Example: pshm/pshm_write.c./ pshm_write / shm - name string Open existing SHM object shm-name and copy string to it Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-25 10.3 Example: pshm/pshm_write.c 1 int fd; 2 size_t len ; /* Size of shared memory object */ 3 char * addr ; 4 fd = shm_open ( argv [1], O_RDWR, 0); 5 len = strlen ( argv [2]); 6 ftruncate (fd, len ); 7 printf (" Resized to %ld bytes \n", ( long ) len ); 8 addr = mmap ( NULL, len, PROT_READ PROT_WRITE, 9 MAP_SHARED, fd, 0); 10 close (fd ); /* fd is no longer needed */ 11 printf (" copying %ld bytes \n", ( long ) len ); 12 memcpy (addr, argv [2], len ); 1 Open existing SHM object 2 Resize object to match length of command-line argument 3 Map object at address chosen by system 4 Copy argv[2] to object (without \0 ) 5 SHM object is closed and unmapped on process termination Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-26 10.3

Example: pshm/pshm_read.c./ pshm_read /shm - name Open existing SHM object shm-name and write the characters it contains to stdout Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-27 10.3 Example: pshm/pshm_read.c 1 int fd; 2 char * addr ; 3 struct stat sb; 4 5 fd = shm_open ( argv [1], O_RDONLY, 0); 6 7 fstat (fd, &sb ); 8 addr = mmap ( NULL, sb. st_size, PROT_READ, MAP_SHARED, 9 fd, 0); 10 close (fd ); /* fd is no longer needed */ 11 12 write ( STDOUT_FILENO, addr, sb. st_size ); 13 printf ("\n"); Open existing SHM object Use fstat() to discover size of object Map the object, using size from fstat() (in sb.st_size) Write all bytes from object to stdout, followed by newline Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-28 10.3

Pointers in shared memory A little care is required when storing pointers in SHM: mmap() maps SHM object at arbitrary location in memory Assuming addr is specified as NULL, as recommended Mapping may be placed at different address in each process Suppose we want to build dynamic data structures, with pointers inside shared memory... E.g., linked list Must use relative offsets, not absolute addresses Absolute address has no meaning if mapping is at different location in another process [TLPI 48.6] Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-29 10.3 Pointers in shared memory Suppose we have situation at right baseaddr is return value from mmap() Want to store pointer to target in *p Wrong way: *p = target Correct method (relative offset): * p = target - baseaddr ; To dereference pointer : target = baseaddr + * p; Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-30 10.3

The /dev/shm filesystem On Linux: tmpfs filesystem used to implement POSIX SHM is mounted at /dev/shm Can list objects in directory with ls(1) ls -l shows permissions, ownership, and size of each object $ ls -l / dev / shm -rw -------. 1 mtk mtk 4096 Oct 27 13:58 myshm -rw -------. 1 mtk mtk 32 Oct 27 13:57 sem. mysem POSIX named semaphores are also visible in /dev/shm As small SHM objects with names prefixed with sem. Can delete objects with rm(1) Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-31 10.3

Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45 Synchronizing access to shared memory Accesses to SHM object by different processes must be synchronized Prevent simultaneous updates Prevent read of partially updated data Semaphores are a common technique POSIX unnamed semaphores are often convenient, since: Semaphore can be placed inside shared memory region (And thus, automatically shared) We avoid task of creating name for semaphore Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-34 10.4

Synchronizing access to shared memory Other synchronization schemes are possible E.g., if using SHM to transfer large data volumes: Using semaphore pair to force alternating access is expensive (two context switches on each transfer!) Divide SHM into (logically numbered) blocks Use pair of pipes to exchange metadata about filled and emptied blocks (also integrates with poll()/epoll!) Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-35 10.4 Example: synchronizing with unnamed semaphores Example application maintains sequence number in SHM object Source files: pshm/pshm_seqnum.h: defines structure stored in SHM object pshm/pshm_seqnum_init.c: Create and open SHM object; Initialize semaphore and (optionally) sequence number inside SHM object pshm/pshm_seqnum_get.c: display current value of sequence number and (optionally) increase its value Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-36 10.4

Example: pshm/pshm_seqnum.h 1 # include <sys / mman.h> 2 # include <fcntl.h> 3 # include < semaphore.h > 4 # include <sys / stat.h> 5 # include " tlpi_hdr.h" 6 7 struct shmbuf { /* Shared memory buffer */ 8 sem_t sem ; /* Semaphore to protect access */ 9 int seqnum ; /* Sequence number */ 10 }; Header file used by pshm/pshm_seqnum_init.c and pshm/pshm_seqnum_get.c Includes headers needed by both programs Defines structure used for SHM object, containing: Unnamed semaphore that guards access to sequence number Sequence number Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-37 10.4 Example: pshm/pshm_seqnum_init.c./ pshm_seqnum_init /shm - name [init - value ] Create and open SHM object Reset semaphore inside object to 1 (i.e., semaphore available) Initialize sequence number Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-38 10.4

Example: pshm/pshm_seqnum_init.c 1 struct shmbuf * shmp ; 2 shm_unlink ( argv [1]); 3 fd = shm_open ( argv [1], O_CREAT O_EXCL O_RDWR, S_IRUSR S_IWUSR ); 4 ftruncate ( fd, sizeof ( struct shmbuf )); 5 shmp = mmap ( NULL, sizeof ( struct shmbuf ), 6 PROT_ READ PROT_ WRITE, MAP_ SHARED, fd, 0); 7 sem_init (&shmp -> sem, 1, 1); 8 if ( argc > 2) 9 shmp -> seqnum = atoi ( argv [2]); 1 Delete previous instance of SHM object, if it exists 2 Create and open SHM object 3 Use ftruncate() to adjust size of object to match structure 4 Map object, using size of structure 5 Initialize semaphore state to available pshared specified as 1, for process sharing of semaphore 6 If argv[2] supplied, initialize sequence # to that value Note: newly extended bytes of SHM object are initialized to 0 Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-39 10.4 Example: pshm/pshm_seqnum_get.c./ pshm_seqnum_get /shm - name [run - length ] Open existing SHM object Fetch and display current value of sequence number in SHM object shm-name If run-length supplied, add to sequence number Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-40 10.4

Example: pshm/pshm_seqnum_get.c (1) 1 int fd, runlength ; 2 struct shmbuf * shmp ; 3 4 fd = shm_open ( argv [1], O_RDWR, 0); 5 6 shmp = mmap ( NULL, sizeof ( struct shmbuf ), 7 PROT_READ PROT_WRITE, MAP_SHARED, fd, 0); Open existing SHM object Map object, using size of shmbuf structure Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-41 10.4 Example: pshm/pshm_seqnum_get.c (2) 1 sem_wait (& shmp -> sem ); 2 printf (" Current value of sequence number : %d\n", 3 shmp -> seqnum ); 4 if ( argc > 2) { 5 runlength = atoi ( argv [2]); 6 if ( runlength <= 0) 7 fprintf ( stderr, " Invalid run - length \n"); 8 else { 9 sleep (3); /* Make update slow */ 10 shmp - > seqnum += runlength ; 11 printf (" Updated semaphore value \ n"); 12 } 13 } 14 sem_post (& shmp -> sem ); Reserve semaphore before touching sequence number Display current value of semaphore If (nonnegative) argv[2] provided, add to sequence number Sleep during update, to see that other processes are blocked Release semaphore Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-42 10.4

Exercise 1 Write two programs that exchange a stream of data of arbitrary length via a POSIX shared memory object [Common header file: pshm/pshm_xfr.h]: The writer creates and initializes the shared memory object and semaphores used by both programs, and then reads blocks of data from stdin and copies them a block at a time to the shared memory region [Template: ex.pshm_xfr_writer.c]. The reader copies each block of data from the shared memory object to stdout [Template: ex.pshm_xfr_reader.c]. Note the following points: You must ensure that the writer and reader have exclusive, alternating access to the shared memory region (so that, for example, the writer does not copy new data into the region before the reader has copied the current data to stdout). This will require the use of a pair of semaphores. (Using two unnamed semaphores stored inside the shared memory object is simplest, but remember that the reader will also need to map the shared memory for writing, so that it can update the semaphores.) The psem/psem_tty_lockstep_init.c and psem/psem_tty_lockstep_second.c programs provided in the POSIX semaphores module show how semaphores can be used for this task. (Those programs use a pair of named semaphores.) [Exercise continues on next page] Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-43 10.4 Exercise When the writer reaches end of file, it should provide an indication to the reader that there is no more data. To do this, maintain a byte-count field in the shared memory region which the writer uses to inform the reader how many bytes are to be written. Setting this count to 0 can be used to signal end-of-file. Once it has sent the last data block, the writer should unlink the shared memory object. Test your programs using a large file that contains random data: $ dd if =/ dev / urandom of = infile count =100000 $./ ex. pshm_xfr_writer < infile & $./ ex. pshm_xfr_reader > outfile $ diff infile outfile There is also a target in the Makefile for performing this test: make pshm_xfr_ test Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-44 10.4

Outline 10 POSIX Shared Memory 10-1 10.1 Overview 10-3 10.2 Creating and opening shared memory objects 10-8 10.3 Using shared memory objects 10-23 10.4 Synchronizing access to shared memory 10-32 10.5 Unmapping and removing shared memory objects 10-45 Unmapping a shared memory object include <sys / mman.h> int munmap ( void * addr, size_t length ); Removes mapping described by addr and length from caller s virtual address space addr: starting address of mapping Must be page-aligned Typically, specify address returned by mmap() length: number of bytes to unmap Rounded up to next page boundary Typically, specify same length as was given to mmap() SHM objects are automatically unmapped on process termination Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-46 10.5

Removing shared memory objects: shm_unlink() # include <sys / mman.h> int shm_unlink ( const char * name ); Removes SHM object name name: pathname of SHM object Object will be deleted once all processes have unmapped it and all FDs from shm_open() have been closed Example: pshm/pshm_unlink.c [TLPI 54.4] Linux/UNIX IPC Programming c 2017, Michael Kerrisk POSIX Shared Memory 10-47 10.5 Notes