Skip to content

Day58 - POSIX Semaphore IPC

Objective

Learn:

  • POSIX named semaphore
  • producer / consumer synchronization
  • shared memory queue
  • ring buffer
  • process-shared pthread mutex

Lab 1 - Basic Semaphore

Build

make

Run waiter

Terminal 1:

./waiter

Run poster

Terminal 2:

./poster

Expected:

waiter wakes up after sem_post()

Lab 2 - sem_trywait()

./trywait

Expected:

EAGAIN when semaphore count is zero

Lab 3 - sem_timedwait()

./timedwait

Expected:

timeout after specified duration

Lab 4 - Shared Memory Producer/Consumer

Cleanup old resources

./shm_cleanup

Start consumer

Terminal 1:

./shm_consumer

Start producer

Terminal 2:

./shm_producer
./shm_producer "hello"
./shm_producer "message"

Expected:

consumer receives shared memory messages

Lab 5 - Ring Buffer Queue

Verify multiple messages are preserved

Terminal 2:

./shm_producer "msg1"
./shm_producer "msg2"
./shm_producer "msg3"

Expected:

consumer receives all messages in order

Lab 6 - Queue Full Test

Terminal 2:

for i in $(seq 1 20); do
    ./shm_producer "msg-$i"
done

Expected:

  • producer blocks on empty semaphore
  • queue does not overwrite unread data

Lab 7 - Multi Producer Test

Terminal 2:

while true; do
    ./shm_producer "A"
done

Terminal 3:

while true; do
    ./shm_producer "B"
done

Expected:

  • queue remains consistent
  • no corruption
  • consumer receives ordered sequence numbers

Key Learning Points

Semaphore

Provides:

  • synchronization
  • resource counting

Does NOT provide:

  • shared data protection

Mutex

Provides:

  • critical section protection
  • queue consistency

Shared Memory

Provides:

  • actual data transport