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