---
name: "TCSETSF2"
section: "2const"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/TCSETS"
---

# TCSETSF2(2const)

get and set terminal attributes

Part of [TCSETS(2const)](/TCSETS/2const.md).

## NAME

TCGETS, TCSETS, TCSETSW, TCSETSF, TCGETS2, TCSETS2, TCSETSW2, TCSETSF2, TCGETA, TCSETA, TCSETAW, TCSETAF - get and set terminal attributes

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <asm/termbits.h>  /* Definition of TC* constants */
#include <sys/ioctl.h>
```

**int ioctl(int** *fd***, TCGETS, struct termios \****argp***);** **int ioctl(int** *fd***, TCSETS, const struct termios \****argp***);** **int ioctl(int** *fd***, TCSETSW, const struct termios \****argp***);** **int ioctl(int** *fd***, TCSETSF, const struct termios \****argp***);**

**int ioctl(int** *fd***, TCGETS2, struct termios2 \****argp***);** **int ioctl(int** *fd***, TCSETS2, const struct termios2 \****argp***);** **int ioctl(int** *fd***, TCSETSW2, const struct termios2 \****argp***);** **int ioctl(int** *fd***, TCSETSF2, const struct termios2 \****argp***);**

**\[\[deprecated\]\] int ioctl(int** *fd***, TCGETA, struct termio \****argp***);** **\[\[deprecated\]\] int ioctl(int** *fd***, TCSETA, const struct termio \****argp***);** **\[\[deprecated\]\] int ioctl(int** *fd***, TCSETAW, const struct termio \****argp***);** **\[\[deprecated\]\] int ioctl(int** *fd***, TCSETAF, const struct termio \****argp***);**

**#include \<asm/termbits.h\>**

**struct termios;** **struct termios2;** **struct \[\[deprecated\]\] termio;**

## DESCRIPTION

- **TCGETS**

  Equivalent to *tcgetattr(fd, argp)*.

-

  Get the current serial port settings.

- **TCSETS**

  Equivalent to *tcsetattr(fd, TCSANOW, argp)*.

-

  Set the current serial port settings.

- **TCSETSW**

  Equivalent to *tcsetattr(fd, TCSADRAIN, argp)*.

-

  Allow the output buffer to drain, and set the current serial port settings.

- **TCSETSF**

  Equivalent to *tcsetattr(fd, TCSAFLUSH, argp)*.

-

  Allow the output buffer to drain, discard pending input, and set the current serial port settings.

The following four ioctls are just like **TCGETS**, **TCSETS**, **TCSETSW**, **TCSETSF**, except that they take a *struct termios2 \** instead of a *struct termios \**. If the structure member **c\_cflag** contains the flag **BOTHER**, then the baud rate is stored in the structure members **c\_ispeed** and **c\_ospeed** as integer values. These ioctls are not supported on all architectures.

- **TCGETS2** **TCSETS2** **TCSETSW2** **TCSETSF2**

  The following four ioctls are just like **TCGETS**, **TCSETS**, **TCSETSW**, **TCSETSF**, except that they take a *struct termio \** instead of a *struct termios \**.

- **TCGETA** **TCSETA** **TCSETAW** **TCSETAF**

  ## RETURN VALUE

On success, 0 is returned. On error, -1 is returned and *errno* is set to indicate the error.

## ERRORS

- **EPERM**

  Insufficient permission.

## HISTORY

- **TCGETS2** **TCSETS2** **TCSETSW2** **TCSETSF2**

  Linux 2.6.20.

## CAVEATS

**struct termios** from *\<asm/termbits.h\>* is different and incompatible with **struct termios** from *\<termios.h\>*. These ioctl calls require **struct termios** from *\<asm/termbits.h\>*.

## EXAMPLES

Get or set arbitrary baudrate on the serial port.

```
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <asm/termbits.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
#if !defined BOTHER
    fprintf(stderr, "BOTHER is unsupported\n");
    /* Program may fallback to TCGETS/TCSETS with Bnnn constants */
    exit(EXIT_FAILURE);
#else
    /* Declare tio structure, its type depends on supported ioctl */
# if defined TCGETS2
    struct termios2 tio;
# else
    struct termios tio;
# endif
    int fd, rc;
    if (argc != 2 && argc != 3 && argc != 4) {
        fprintf(stderr, "Usage: %s device [output [input] ]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY);
    if (fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    /* Get the current serial port settings via supported ioctl */
# if defined TCGETS2
    rc = ioctl(fd, TCGETS2, &tio);
# else
    rc = ioctl(fd, TCGETS, &tio);
# endif
    if (rc) {
        perror("TCGETS");
        close(fd);
        exit(EXIT_FAILURE);
    }
    /* Change baud rate when more arguments were provided */
    if (argc == 3 || argc == 4) {
        /* Clear the current output baud rate and fill a new value */
        tio.c_cflag &= ~CBAUD;
        tio.c_cflag |= BOTHER;
        tio.c_ospeed = atoi(argv[2]);
        /* Clear the current input baud rate and fill a new value */
        tio.c_cflag &= ~(CBAUD << IBSHIFT);
        tio.c_cflag |= BOTHER << IBSHIFT;
        /* When 4th argument is not provided reuse output baud rate */
        tio.c_ispeed = (argc == 4) ? atoi(argv[3]) : atoi(argv[2]);
        /* Set new serial port settings via supported ioctl */
# if defined TCSETS2
        rc = ioctl(fd, TCSETS2, &tio);
# else
        rc = ioctl(fd, TCSETS, &tio);
# endif
        if (rc) {
            perror("TCSETS");
            close(fd);
            exit(EXIT_FAILURE);
        }
        /* And get new values which were really configured */
# if defined TCGETS2
        rc = ioctl(fd, TCGETS2, &tio);
# else
        rc = ioctl(fd, TCGETS, &tio);
# endif
        if (rc) {
            perror("TCGETS");
            close(fd);
            exit(EXIT_FAILURE);
        }
    }
    close(fd);
    printf("output baud rate: %u\n", tio.c_ospeed);
    printf("input baud rate: %u\n", tio.c_ispeed);
    exit(EXIT_SUCCESS);
#endif
}
```

## SEE ALSO

[**ioctl**(2)](/ioctl/2.md), [**ioctl\_tty**(2)](/ioctl_tty/2.md), [**termios**(7)](/termios/7.md)
