Previous: posix sem api, Up: posix sem [Index]
The following example shows how two processes can synchronise themselves to exchange a signed integer using a POSIX shared memory object and an unnamed POSIX semaphore allocated in such an object; the parent process sets up the shared memory and initialises the semaphore, then it waits for the semaphore and reads the integer; the child process writes an integer in the shared memory, then it posts the semaphore.
Notice that the informations the two processes share are:
#!r6rs (import (vicare) (prefix (vicare posix) px.) (vicare platform constants) (only (vicare language-extensions syntaxes) callet)) (define shm.pathname "/vicare.test") (define shm.dim (px.sysconf _SC_PAGESIZE)) (define (parent child-pid) (let ((shm.fd (callet px.shm-open shm.pathname (oflags (fxior O_CREAT O_EXCL O_RDWR)) (mode (fxior S_IRUSR S_IWUSR))))) (px.ftruncate shm.fd shm.dim) (unwind-protect (let ((shm.base (callet px.mmap (address #f) (size shm.dim) (prot (fxior PROT_READ PROT_WRITE)) (flags MAP_SHARED) (fd shm.fd) (offset 0)))) (unwind-protect (let* ((sem_t shm.base) (shm.start (pointer-add shm.base (px.sizeof-sem_t))) (sem_t (callet px.sem-init sem_t (pshared? #t) (value 0)))) (define timeout (let ((T (px.clock-gettime CLOCK_REALTIME (px.make-struct-timespec 0 0)))) (px.set-struct-timespec-tv_sec! T (+ 2 (px.struct-timespec-tv_sec T))) T)) (unwind-protect (begin (px.sem-timedwait sem_t timeout) (pointer-ref-c-signed-int shm.start 0)) (px.sem-destroy sem_t))) (px.munmap shm.base shm.dim))) (px.close shm.fd) (px.shm-unlink shm.pathname)))) (define (child) ;; Give the parent some time to open the ;; shared memory object. (px.nanosleep 1 0) (let ((shm.fd (callet px.shm-open shm.pathname (oflags (fxior O_CREAT O_RDWR)) (mode (fxior S_IRUSR S_IWUSR))))) (unwind-protect (let ((shm.base (callet px.mmap (address #f) (size shm.dim) (prot (fxior PROT_READ PROT_WRITE)) (flags MAP_SHARED) (fd shm.fd) (offset 0)))) (unwind-protect (let* ((sem_t shm.base) (shm.start (pointer-add shm.base (px.sizeof-sem_t)))) (pointer-set-c-signed-int! shm.start 0 123) (px.sem-post sem_t)) (px.munmap shm.base shm.dim))) (px.close shm.fd))) (exit 0)) (px.fork parent child) ⇒ 123
The following example shows how two processes can synchronise themselves to exchange a signed integer using a POSIX shared memory object and a named POSIX semaphore; the parent process sets up the shared memory and the semaphore, then it waits for the semaphore and reads the integer; the child process writes an integer in the shared memory, then it posts the semaphore.
Notice that the informations the two processes share are:
#!r6rs (import (vicare) (prefix (vicare posix) px.) (vicare platform constants) (only (vicare language-extensions syntaxes) unwind-protect callet)) (define sem.pathname "/vicare-posix-sem.test") (define shm.pathname "/vicare-posix-shm.test") (define shm.dim (px.sysconf _SC_PAGESIZE)) (define (parent child-pid) (let ((sem_t (callet px.sem-open sem.pathname (oflags (fxior O_CREAT O_EXCL O_RDWR)) (mode (fxior S_IRUSR S_IWUSR)))) (shm.fd (callet px.shm-open shm.pathname (oflags (fxior O_CREAT O_EXCL O_RDWR)) (mode (fxior S_IRUSR S_IWUSR))))) (px.ftruncate shm.fd shm.dim) (unwind-protect (let ((shm.base (callet px.mmap (address #f) (size shm.dim) (prot (fxior PROT_READ PROT_WRITE)) (flags MAP_SHARED) (fd shm.fd) (offset 0)))) (unwind-protect (begin (px.sem-wait sem_t) (pointer-ref-c-signed-int shm.base 0)) (px.munmap shm.base shm.dim))) (px.close shm.fd) (px.shm-unlink shm.pathname) (px.sem-close sem_t) (px.sem-unlink sem.pathname)))) (define (child) ;; Give the parent some time to open the ;; shared memory object. (px.nanosleep 1 0) (let ((sem_t (callet px.sem-open sem.pathname (oflags (fxior O_CREAT O_RDWR)) (mode (fxior S_IRUSR S_IWUSR)))) (shm.fd (callet px.shm-open shm.pathname (oflags (fxior O_CREAT O_RDWR)) (mode (fxior S_IRUSR S_IWUSR))))) (unwind-protect (let ((shm.base (callet px.mmap (address #f) (size shm.dim) (prot (fxior PROT_READ PROT_WRITE)) (flags MAP_SHARED) (fd shm.fd) (offset 0)))) (unwind-protect (begin (pointer-set-c-signed-int! shm.base 0 123) (px.sem-post sem_t)) (px.munmap shm.base shm.dim))) (px.close shm.fd) (px.sem-close sem_t))) (exit 0)) (px.fork parent child) ⇒ 123
Previous: posix sem api, Up: posix sem [Index]