#include <sys/types.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wait.h>
int
main(void)
{
void *buf;
pid_t child;
int ret, i;
siginfo_t info;
uint8_t *ubuf;
size_t mapsz = sysconf(_SC_PAGESIZE) * 2;
buf = mmap(NULL, mapsz, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
assert(buf != MAP_FAILED);
memset(buf, 'a', mapsz);
ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 0);
assert(ret == 0);
child = fork();
if (child == 0) {
for (i = 0, ubuf = buf; i < mapsz; i++)
assert(ubuf[i] == 0);
exit(0);
}
assert(child != -1);
do {
ret = waitid(P_PID, child, &info, WEXITED);
} while (ret == -1 && errno == EINTR);
assert(ret == 0);
assert(info.si_pid == child);
assert(info.si_status == 0);
for (i = 0, ubuf = buf; i < mapsz; i++)
assert(ubuf[i] == 'a');
return (0);
}