tcgetattr函数
时间: 2024-05-14 12:12:48 浏览: 24
tcgetattr函数是一个系统调用函数,用于获取与终端相关的参数。该函数接受一个文件描述符作为参数,返回一个termios结构体,该结构体包含了与终端相关的参数。
该函数的语法如下:
```c
int tcgetattr(int fd, struct termios *termios_p);
```
参数说明:
- fd:要获取参数的终端的文件描述符。
- termios_p:指向一个termios结构体的指针,用于存储获取到的参数。
返回值:
- 成功:返回0。
- 失败:返回-1,并将errno设置为相应的错误码。
相关问题
显示linux系统的tcgetattr函数源码
`tcgetattr` 是一个系统调用函数,其源码实现位于内核中。下面是 `tcgetattr` 函数的源码:
```c
int tcgetattr(int fd, struct termios *termios_p)
{
struct tty_struct *tty;
int ret = 0;
tty = get_current_tty();
if (!tty)
return -ENXIO;
mutex_lock(&tty->termios_mutex);
if (fd != tty->driver->ttynr) {
ret = -EINVAL;
goto out_unlock;
}
ret = tty_termios_copy_hw(tty, termios_p);
if (ret)
goto out_unlock;
ret = tty_termios_copy_ld(tty, termios_p);
if (ret)
goto out_unlock;
out_unlock:
mutex_unlock(&tty->termios_mutex);
return ret;
}
```
该函数接受两个参数:一个文件描述符 `fd` 和一个指向 `termios` 结构的指针 `termios_p`。
`tcgetattr` 在内部调用 `get_current_tty` 函数,获取当前进程所连接的 tty 设备,并使用 `tty->driver->ttynr` 检查传递的文件描述符是否与该 tty 设备的文件描述符相匹配。如果不匹配,则返回 `-EINVAL` 错误码。
如果文件描述符匹配,`tcgetattr` 将调用 `tty_termios_copy_hw` 和 `tty_termios_copy_ld` 函数来将 tty 的硬件和软件参数复制到 `termios_p` 结构中。如果复制失败,`tcgetattr` 将返回相应的错误码。
最后,`tcgetattr` 函数将释放 tty 设备的 termios 互斥锁,并返回执行结果。
显示ppp2.7.4源码中使用的tcgetattr函数源码文件位置和源码
在 ppp2.7.4 源码中,tcgetattr 函数的实现位于文件 `pppd/tty.c` 中。
以下是 `tty.c` 文件中的 `tcgetattr` 函数的源码:
```c
/********************************************************************
*
* Function: tcgetattr
*
* Description: Get the current terminal attributes.
*
********************************************************************/
int
tcgetattr(fd, tios)
int fd;
struct termios *tios;
{
#ifdef HAVE_TERMIOS_H
return tcgetattr(fd, tios);
#else
struct sgttyb buf;
if (ioctl(fd, TIOCGETP, &buf) < 0)
return (-1);
tios->c_ispeed = tios->c_ospeed = buf.sg_ospeed;
tios->c_cflag = (buf.sg_flags & ~ECHO) | CLOCAL | CREAD;
tios->c_cc[VEOF] = CEOF;
tios->c_cc[VEOL] = CEOL;
return (0);
#endif
}
```
注意,如果系统支持 `termios.h` 头文件,`tcgetattr` 函数将会调用系统提供的 `tcgetattr` 函数。否则,它将使用 `ioctl` 函数和 `TIOCGETP` 命令来获取终端属性,并将结果复制到 `termios` 结构中。