#include #include #include #include #include #include #include #include int main(int argc, char **argv) { int master, slave; char *slavename; // revoke(2) only works on character devices, so open a tty master = posix_openpt(O_NOCTTY | O_RDWR); assert(master >= 0); assert(0 == grantpt(master)); slavename = ptsname(master); assert(NULL != slavename); //close stdout so we can reuse its filedesc assert(0 == close(STDIN_FILENO)); slave = open(slavename, O_RDWR); if (slave < 0) err(1, "open slave"); assert(STDIN_FILENO == slave); //should reuse stdin // Revoke the slave device. // Now all open file descriptors referring to it will be invalid assert(0 == revoke(slavename)); // Issue 649: Monit will assert with an error like this: // Standard filedescriptor open failed -- expected fd 0, got 3 execlp("monit", "monit", "restart", "pubsubd", NULL); err(1, "execl returned"); return(0); }