---
name: "tcdrain"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/tcdrain"
---

# tcdrain(3)

line control functions

## NAME

**tcsendbreak**, **tcdrain**, **tcflush**, **tcflow** – line control functions

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<termios.h\>**

*int*\

**tcdrain**(*int fd*);

*int*\

**tcflow**(*int fd*, *int action*);

*int*\

**tcflush**(*int fd*, *int action*);

*int*\

**tcsendbreak**(*int fd*, *int len*);

## DESCRIPTION

The **tcdrain**() function waits until all output written to the terminal referenced by *fd* has been transmitted to the terminal.

The **tcflow**() function suspends transmission of data to or the reception of data from the terminal referenced by *fd* depending on the value of *action*. The value of *action* must be one of the following:

- *TCOOFF*

  Suspend output.

- *TCOON*

  Restart suspended output.

- *TCIOFF*

  Transmit a STOP character, which is intended to cause the terminal to stop transmitting data to the system. (See the description of IXOFF in the ‘Input Modes’ section of [termios(4)](/termios/4.md)).

- *TCION*

  Transmit a START character, which is intended to cause the terminal to start transmitting data to the system. (See the description of IXOFF in the ‘Input Modes’ section of [termios(4)](/termios/4.md)).

The **tcflush**() function discards any data written to the terminal referenced by *fd* which has not been transmitted to the terminal, or any data received from the terminal but not yet read, depending on the value of *action*. The value of *action* must be one of the following:

- *TCIFLUSH*

  Flush data received but not read.

- *TCOFLUSH*

  Flush data written but not transmitted.

- *TCIOFLUSH*

  Flush both data received but not read and data written but not transmitted.

The **tcsendbreak**() function transmits a continuous stream of zero-valued bits for four-tenths of a second to the terminal referenced by *fd*. The *len* argument is ignored in this implementation.

## RETURN VALUES

Upon successful completion, all of these functions return a value of zero.

## ERRORS

If any error occurs, a value of -1 is returned and the global variable *errno* is set to indicate the error, as follows:

- \[EBADF\]

  The *fd* argument is not a valid file descriptor.

- \[EINVAL\]

  The *action* argument is not a proper value.

- \[ENOTTY\]

  The file associated with *fd* is not a terminal.

- \[EINTR\]

  A signal interrupted the **tcdrain**() function.

- \[EWOULDBLOCK\]

  The configured timeout expired before the **tcdrain**() function could write all buffered output.

## SEE ALSO

[tcsetattr(3)](/tcsetattr/3.md), [termios(4)](/termios/4.md), [tty(4)](/tty/4.md), [comcontrol(8)](/comcontrol/8.md)

## STANDARDS

The **tcsendbreak**(), **tcflush**() and **tcflow**() functions are expected to be compliant with the IEEE Std 1003.1-1988 (“POSIX.1”) specification.

The **tcdrain**() function is expected to be compliant with IEEE Std 1003.1-1988 (“POSIX.1”) when the drain wait value is set to zero with [comcontrol(8)](/comcontrol/8.md), or with [ioctl(2)](/ioctl/2.md) *TIOCSDRAINWAIT*, or with [sysctl(8)](/sysctl/8.md) *kern.tty\_drainwait*. A non-zero drain wait value can result in **tcdrain**() returning *EWOULDBLOCK* without writing all output. The default value for *kern.tty\_drainwait* is 300 seconds.
