父级调用fork并让子级创建新会话。我试图验证孩子不再有控制终端。
...
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
} else if (pid == 0) { /* child */
if (setsid() < 0) {
perror("setsid");
exit(1);
}
char ch;
if (read(STDIN_FILENO, &ch, 1) != 1) {
printf("read error from controlling TTY, errno = %d\n", errno);
}
exit(0);
}
... /* parent */
正如我们所知,应该打印错误消息,但事实并非如此。我做错什么了吗?有没有办法正确地做到这一点?感谢。
答案 0 :(得分:6)
拥有正常工作的tty文件描述符并不意味着控制终端。您应该可以通过打开/dev/tty
来测试控制tty。如果你有一个控制tty,/dev/tty
将作为它的别名。如果不这样做,打开它会失败。
另一种不那么便携的方法是读取/proc/self/stat
中的第7个字段。