gpt4 book ai didi

glibc "login_tty()"函数 : "open(ttyname)" immediately followed by "close()" 的代码解释

转载 作者:太空狗 更新时间:2023-10-29 11:40:40 26 4
gpt4 key购买 nike

我在阅读 glibc 代码,特别是 login_tty 函数时,我发现了一段对我来说意义不大的代码:

newfd = open (fdname, O_RDWR);
(void) close (newfd);

这个打开一个文件然后马上关闭,我想知道为什么

complete function code :

int
login_tty (int fd)
{
(void) setsid();
#ifdef TIOCSCTTY
if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1)
return (-1);
#else
{
/* This might work. */
char *fdname = ttyname (fd);
int newfd;
if (fdname)
{
if (fd != 0)
(void) close (0);
if (fd != 1)
(void) close (1);
if (fd != 2)
(void) close (2);
newfd = open (fdname, O_RDWR);
(void) close (newfd);
}
}
#endif
while (dup2(fd, 0) == -1 && errno == EBUSY)
;
while (dup2(fd, 1) == -1 && errno == EBUSY)
;
while (dup2(fd, 2) == -1 && errno == EBUSY)
;
if (fd > 2)
(void) close(fd);
return (0);
}

最佳答案

我无法给出明确的答案,但它以某种方式尝试使与 fd 关联的终端成为进程的控制终端

如果您查看代码的第一个替代方案,它使用了 ioctl:TIOCSCTTY。这一个记录为“使给定终端成为调用进程的控制终端。[...]”,例如参见 this manpage .

如果 TIOCSCTTY ioctl 不可用,您不理解的代码位于替代部分。我只能猜测,在关闭所有标准文件描述符(02)之后,打开一个 tty 文件可能会产生副作用使其成为控制终端。

关于glibc "login_tty()"函数 : "open(ttyname)" immediately followed by "close()" 的代码解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51593530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com