Linux 编程接口说SIGHUP
被发送到终端的控制进程
当工作站上的终端窗口关闭时。这是因为与终端窗口关联的伪终端的主端的最后一个打开文件描述符已关闭。
我的理解是终端窗口是为从端创建的,主端可以有多个从端。因此,当终端窗口关闭时,仅意味着与终端窗口关联的伪终端的从端的最后打开文件描述符已关闭。为什么引用说“大师”的一面?
谢谢。
Linux 编程接口说SIGHUP
被发送到终端的控制进程
当工作站上的终端窗口关闭时。这是因为与终端窗口关联的伪终端的主端的最后一个打开文件描述符已关闭。
我的理解是终端窗口是为从端创建的,主端可以有多个从端。因此,当终端窗口关闭时,仅意味着与终端窗口关联的伪终端的从端的最后打开文件描述符已关闭。为什么引用说“大师”的一面?
谢谢。
打开伪终端的主控部分后
int fd_pseudo_term_master = open("/dev/ptmx",O_RDWR);
有/dev/pts/[NUMBER]
创建的文件,代表slave
他的伪终端的一部分。
像我这样无知的人可能会认为,在完成之后,ptsname(fd_pseudo_term_master,filename_pseudo_term_slave,buflen);
应该将其设置为简单地
做好事int fd_pseudo_term_slave = open(filename_pseudo_term_slave,O_RDWR);
。
然而,必须有一个非常重要的“锁定”伪终端从机用例,因为为了简单起见,在open
调用之前,必须使用man 3 unlockpt来“解锁”。
我无法找出这个用例是什么?最初锁定伪终端需要什么?用代码实现了什么(取自 libc)
/* Unlock the slave pseudo terminal associated with the master pseudo
terminal specified by FD. */
int
unlockpt (int fd)
{
#ifdef TIOCSPTLCK
int save_errno = errno;
int unlock = 0;
if (ioctl (fd, TIOCSPTLCK, &unlock))
{
if (errno == EINVAL)
{
errno = save_errno;
return 0;
}
else
return -1;
}
#endif
/* If we have no TIOCSPTLCK ioctl, all slave pseudo terminals are
unlocked by default. */
return 0;
}
如果可能,答案将详细说明用例,历史或当前。
问题的额外部分是:
当前的 linux 内核是否仍然依赖于“锁定伪终端从站”的这种功能?
想法:这是避免比赛的低效尝试吗?
等待答案我已经更多地研究了 linux 内核源代码,但自己没有任何好的答案。但是,似乎可以从伪终端的初始锁定情况中“提取”的一种用途是为伪终端主进程提供一些时间来设置对文件的访问权限/dev/pts/[NUMBER]
,以防止某些用户首先访问该文件。这可以作为答案的一部分吗?奇怪的是,然而,这种“初始锁定”状态似乎并不能真正阻止从属文件的多次打开,至少我认为在这里可以保证原子性。