Index: lib/libc/sys/shm_open.2 =================================================================== --- lib/libc/sys/shm_open.2 +++ lib/libc/sys/shm_open.2 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 18, 2013 +.Dd January 6, 2017 .Dt SHM_OPEN 2 .Os .Sh NAME @@ -171,26 +171,30 @@ .Dv O_TRUNC flags may be used in portable programs. .Pp -The result of using -.Xr open 2 , -.Xr read 2 , -or -.Xr write 2 -on a shared memory object, or on the descriptor returned by -.Fn shm_open , -is undefined. -It is also undefined whether the shared memory object itself, or its -contents, persist across reboots. -.Pp -In FreeBSD, -.Xr read 2 -and -.Xr write 2 -on a shared memory object will fail with -.Er EOPNOTSUPP -and neither shared memory objects nor their contents persist across reboots. +Writing to shared-memory objects requires that +.Xr ftruncate 2 +has first been called on them. +This example fails without the call to +.Xr ftruncate 2 : +.Bd -literal -compact + + uint8_t buffer[getpagesize()]; + ssize_t len; + int fd; + + fd = shm_open(SHM_ANON, O_RDWR | O_CREAT, 0600); + if (fd < 0) + err(EX_OSERR, "%s: shm_open", __func__); + if (ftruncate(fd, getpagesize()) < 0) + err(EX_IOERR, "%s: ftruncate", __func__); + len = pwrite(fd, buffer, getpagesize(), 0); + if (len < 0) + err(EX_IOERR, "%s: pwrite", __func__); + if (len != getpagesize()) + errx(EX_IOERR, "%s: pwrite length mismatch", __func__); +.Ed .Sh ERRORS -The following errors are defined for +These errors are defined for .Fn shm_open : .Bl -tag -width Er .It Bq Er EINVAL @@ -235,7 +239,7 @@ The required permissions (for reading or reading and writing) are denied. .El .Pp -The following errors are defined for +These errors are defined for .Fn shm_unlink : .Bl -tag -width Er .It Bq Er EFAULT