Preface

Part 1.Introduction 1


Chapter 1.Introduction 3

1.1Introduction3
1.2Processes, Threads, and the Sharing of Information5
1.3Persistence of IPC Objects6
1.4Name Spaces7
1.5Effect of fork, exec, and exit on IPC Objects9
1.6Error Handling: Wrapper Functions11
1.7Unix Standards13
1.8Road Map to IPC Examples in the Text15
1.9Summary16

Chapter 2.Posix IPC 19

2.1Introduction19
2.2IPC Names19
2.3Creating and Opening IPC Channels22
2.4IPC Permissions25
2.5Summary26

Chapter 3.System V IPC 27

3.1Introduction27
3.2key_t Keys and ftok Function28
3.3ipc_perm Structure30
3.4Creating and Opening IPC Channels30
3.5IPC Permissions32
3.6Identifier Reuse34
3.7ipcs and ipcrm Programs36
3.8Kernel Limits36
3.9Summary38

Part 2.Message Passing 41


Chapter 4.Pipes and FIFOs 43

4.1Introduction43
4.2A Simple Client-Server Example43
4.3Pipes44
4.4Full-Duplex Pipes50
4.5popen and pclose Functions52
4.6FIFOs54
4.7Additional Properties of Pipes and FIFOs58
4.8One Server, Multiple Clients60
4.9Iterative versus Concurrent Servers66
4.10Streams and Messages67
4.11Pipe and FIFO Limits72
4.12Summary73

Chapter 5.Posix Message Queues 75

5.1Introduction75
5.2mq_open, mq_close, and mq_unlink Functions76
5.3mq_getattr and mq_setattr Functions79
5.4mq_send and mq_receive Functions82
5.5Message Queue Limits86
5.6mq_notify Function87
5.7Posix Realtime Signals98
5.8Implementation Using Memory-Mapped I/O106
5.9Summary126

Chapter 6.System V Message Queues 129

6.1Introduction129
6.2msgget Function130
6.3msgsnd Function131
6.4msgrcv Function132
6.5msgctl Function134
6.6Simple Programs135
6.7Client-Server Example140
6.8Multiplexing Messages142
6.9Message Queues with select and poll151
6.10Message Queue Limits152
6.11Summary155

Part 3.Synchronization 157


Chapter 7.Mutexes and Condition Variables 159

7.1Introduction159
7.2Mutexes: Locking and Unlocking159
7.3Producer-Consumer Problem161
7.4Locking versus Waiting165
7.5Condition Variables: Waiting and Signaling167
7.6Condition Variables: Timed Waits and Broadcasts171
7.7Mutexes and Condition Variable Attributes172
7.8Summary174

Chapter 8.Read-Write Locks 177

8.1Introduction177
8.2Obtaining and Releasing Read-Write Locks178
8.3Read-Write Lock Attributes179
8.4Implementation Using Mutexes and Condition Variables179
8.5Thread Cancellation187
8.6Summary192

Chapter 9.Record Locking 193

9.1Introduction193
9.2Record Locking versus File Locking197
9.3Posix fcntl Record Locking199
9.4Advisory Locking203
9.5Mandatory Locking204
9.6Priorities of Readers and Writers207
9.7Starting Only One Copy of a Daemon213
9.8Lock Files214
9.9NFS Locking216
9.10Summary216

Chapter 10.Posix Semaphores 219

10.1Introduction219
10.2sem_open, sem_close, and sem_unlink Functions225
10.3sem_wait and sem_trywait Functions226
10.4sem_post and sem_getvalue Functions227
10.5Simple Programs228
10.6Producer-Consumer Problem233
10.7File Locking238
10.8sem_init and sem_destroy Functions238
10.9Multiple Producers, One Consumer242
10.10Multiple Producers, Multiple Consumers245
10.11Multiple Buffers249
10.12Sharing Semaphores between Processes256
10.13Semaphore Limits257
10.14Implementation Using FIFOs257
10.15Implementation Using Memory-Mapped I/O262
10.16Implementation Using System V Semaphores271
10.17Summary278

Chapter 11.System V Semaphores 281

11.1Introduction281
11.2semget Function282
11.3semop Function285
11.4semctl Function287
11.5Simple Programs289
11.6File Locking294
11.7Semaphore Limits296
11.8Summary300

Part 4.Shared Memory 301


Chapter 12.Shared Memory Introduction 303

12.1Introduction303
12.2mmap, munmap, and msync Functions307
12.3Increment Counter in a Memory-Mapped File311
12.44.4BSD Anonymous Memory Mapping315
12.5SVR4 /dev/zero Memory Mapping316
12.6Referencing Memory-Mapped Objects317
12.7Summary322

Chapter 13.Posix Shared Memory 325

13.1Introduction325
13.2shm_open and shm_unlink Functions326
13.3ftruncate and fstat Functions327
13.4Simple Programs328
13.5Incrementing a Shared Counter333
13.6Sending Messages to a Server336
13.7Summary342

Chapter 14.System V Shared Memory 343

14.1Introduction343
14.2shmget Function343
14.3shmat Function344
14.4shmdt Function345
14.5shmctl Function345
14.6Simple Programs346
14.7Shared Memory Limits349
14.8Summary351

Part 5.Remote Procedure Calls 353


Chapter 15.Doors 355

15.1Introduction355
15.2door_call Function361
15.3door_create Function363
15.4door_return Function364
15.5door_cred Function365
15.6door_info Function365
15.7Examples366
15.8Descriptor Passing379
15.9door_server_create Function384
15.10door_bind, door_unbind, and door_revoke Functions390
15.11Premature Termination of Client or Server390
15.12Summary397

Chapter 16.Sun RPC 399

16.1Introduction399
16.2Multithreading407
16.3Server Binding411
16.4Authentication414
16.5Timeout and Retransmission417
16.6Call Semantics422
16.7Premature Termination of Client or Server424
16.8XDR: External Data Representation426
16.9RPC Packet Formats444
16.10Summary449

Epilogue 453

Appendix A.Performance Measurements 457

A.1Introduction457
A.2Results458
A.3Message Passing Bandwidth Programs467
A.4Message Passing Latency Programs480
A.5Thread Synchronization Programs486
A.6Process Synchronization Programs497

Appendix B.A Threads Primer 501

B.1Introduction501
B.2Basic Thread Functions: Creation and Termination502

Appendix C.Miscellaneous Source Code 505

C.1unpipc.h Header505
C.2config.h Header509
C.3Standard Error Functions510

Appendix D.Solutions to Selected Exercises 515

Bibliography 535

Index 539