#include #include #include #include #include #include #include #include #include #include static void do_work(const char *tty) { char buf[256]; unsigned int cnt = 0; unsigned int errc = 0; int fd, con; if (signal(SIGHUP, SIG_IGN) == SIG_ERR) err(1, "signal(SIGHUP)"); setsid(); con = open("/tmp/aaa", O_WRONLY|O_NOCTTY|O_CREAT); if (con < 0) err(2, "open cons"); while (1) { if (!(cnt++ % 10000)) { int len = sprintf(buf, "err=%x\n", errc); write(con, buf, len); errc = 0; } fd = open(tty, O_RDWR|O_NOCTTY); if (fd < 0) { errc |= 1; continue; } if (ioctl(fd, TIOCSCTTY)) { errc |= 2; continue; } if (vhangup()) { errc |= 4; continue; } close(fd); } close(con); exit(errc); } int main(int argc, char **argv) { pid_t pid; switch (pid = fork()) { case 0: do_work(argv[1]); break; case -1: err(1, "fork"); break; default: { int stat; waitpid(pid, &stat, 0); if (stat) { fprintf(stderr, "exited with: %d sig=%d signr=%u\n", WEXITSTATUS(stat), WIFSIGNALED(stat), WTERMSIG(stat)); } break; } } return 0; }