STRUCT TTY_LDISC_OPS(9)
π NAME π
struct tty_ldisc_ops β ldisc operations. That's the whole vibe, bestie: this struct is the operations table for a tty line discipline, and today's main-character manual page is struct tty_ldisc_ops(9) from the Kernel API Manual. β¨
β¨ SYNOPSIS β¨
struct tty_ldisc_ops {
char *name;
int num;
int (*open)(struct tty_struct *tty);
void (*close)(struct tty_struct *tty);
void (*flush_buffer)(struct tty_struct *tty);
ssize_t (*read)(struct tty_struct *tty, struct file *file, u8 *buf,
size_t nr, void **cookie, unsigned long offset);
ssize_t (*write)(struct tty_struct *tty, struct file *file, const u8
*buf, size_t nr);
int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long
arg);
int (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd,
unsigned long arg);
void (*set_termios)(struct tty_struct *tty, const struct ktermios
*old);
__poll_t (*poll)(struct tty_struct *tty, struct file *file, struct
poll_table_struct *wait);
void (*hangup)(struct tty_struct *tty);
void (*receive_buf)(struct tty_struct *tty, const u8 *cp, const u8
*fp, size_t count);
void (*write_wakeup)(struct tty_struct *tty);
void (*dcd_change)(struct tty_struct *tty, bool active);
size_t (*receive_buf2)(struct tty_struct *tty, const u8 *cp, const
u8 *fp, size_t count);
void (*lookahead_buf)(struct tty_struct *tty, const u8 *cp, const u8
*fp, size_t count);
struct module *owner;
};
πΈ Members πΈ
nameβ name of this ldisc, rendered in/proc/tty/ldiscsnumβ theN_*number (N_TTY,N_HDLC, ...) reserved to this ldiscopenβ [TTY]int ()(struct tty_struct *tty)closeβ [TTY]void ()(struct tty_struct *tty)flush_bufferβ [TTY]void ()(struct tty_struct *tty)readβ [TTY]ssize_t ()(struct tty_struct *tty, struct file *file, u8 *buf, size_t nr)writeβ [TTY]ssize_t ()(struct tty_struct *tty, struct file *file, const u8 *buf, size_t nr)ioctlβ [TTY]int ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)compat_ioctlβ [TTY]int ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)set_termiosβ [TTY]void ()(struct tty_struct *tty, const struct ktermios *old)pollβ [TTY]int ()(struct tty_struct *tty, struct file *file, struct poll_table_struct *wait)hangupβ [TTY]void ()(struct tty_struct *tty)receive_bufβ [DRV]void ()(struct tty_struct *tty, const u8 *cp, const u8 *fp, size_t count)write_wakeupβ [DRV]void ()(struct tty_struct *tty)dcd_changeβ [DRV]void ()(struct tty_struct *tty, bool active)receive_buf2β [DRV]ssize_t ()(struct tty_struct *tty, const u8 *cp, const u8 *fp, size_t count)lookahead_bufβ [DRV]void ()(struct tty_struct *tty, const u8 *cp, const u8 *fp, size_t count)ownerβ module containing this ldisc (for reference counting)
π«Ά DESCRIPTION π«Ά
open β This function is called when the line discipline is associated with the tty. No other call into the line discipline for this tty will occur until it completes successfully. It should initialize any state needed by the ldisc, and set tty->receive_room to the maximum amount of data the line discipline is willing to accept from the driver with a single call to receive_buf. Returning an error will prevent the ldisc from being attached.
Optional. Can sleep.
close β This function is called when the line discipline is being shutdown, either because the tty is being closed or because the tty is being changed to use a new line discipline. At the point of execution no further users will enter the ldisc code for this tty.
Optional. Can sleep.
flush_buffer β This function instructs the line discipline to clear its buffers of any input characters it may have queued to be delivered to the user mode process. It may be called at any point between open and close.
Optional.
read β This function is called when the user requests to read from the tty. The line discipline will return whatever characters it has buffered up for the user. If this function is not defined, the user will receive an EIO error. Multiple read calls may occur in parallel and the ldisc must deal with serialization issues.
Optional: EIO unless provided. Can sleep.
write β This function is called when the user requests to write to the tty. The line discipline will deliver the characters to the low-level tty device for transmission, optionally performing some processing on the characters first. If this function is not defined, the user will receive an EIO error.
Optional: EIO unless provided. Can sleep.
ioctl β This function is called when the user requests an ioctl which is not handled by the tty layer or the low-level tty driver. It is intended for ioctls which affect line discipline operation. Note that the search order for ioctls is (1) tty layer, (2) tty low-level driver, (3) line discipline. So a low-level driver can "grab" an ioctl request before the line discipline has a chance to see it.
Optional.
compat_ioctl β Process ioctl calls from 32-bit process on 64-bit system.
Note that only ioctls that are neither "pointer to compatible structure" nor tty-generic. Something private that takes an integer or a pointer to wordsize-sensitive structure belongs here, but most of ldiscs will happily leave it NULL.
Optional.
set_termios β This function notifies the line discipline that a change has been made to the termios structure.
Optional.
poll β This function is called when a user attempts to select/poll on a tty device. It is solely the responsibility of the line discipline to handle poll requests.
Optional.
hangup β Called on a hangup. Tells the discipline that it should cease I/O to the tty driver. The driver should seek to perform this action quickly but should wait until any pending driver I/O is completed. No further calls into the ldisc code will occur.
Optional. Can sleep.
receive_buf β This function is called by the low-level tty driver to send characters received by the hardware to the line discipline for processing. cp is a pointer to the buffer of input character received by the device. fp is a pointer to an array of flag bytes which indicate whether a character was received with a parity error, etc. fp may be NULL to indicate all data received is TTY_NORMAL.
Optional.
write_wakeup β This function is called by the low-level tty driver to signal that line discipline should try to send more characters to the low-level driver for transmission. If the line discipline does not have any more data to send, it can just return. If the line discipline does have some data to send, please arise a tasklet or workqueue to do the real data transfer.
Do not send data in this hook, it may lead to a deadlock. π
Optional.
dcd_change β Tells the discipline that the DCD pin has changed its status. Used exclusively by the N_PPS (Pulse-Per-Second) line discipline.
Optional.
receive_buf2 β This function is called by the low-level tty driver to send characters received by the hardware to the line discipline for processing. cp is a pointer to the buffer of input character received by the device. fp is a pointer to an array of flag bytes which indicate whether a character was received with a parity error, etc. fp may be NULL to indicate all data received is TTY_NORMAL. If assigned, prefer this function for automatic flow control.
Optional.
lookahead_buf β This function is called by the low-level tty driver for characters not eaten by ->receive_buf or ->receive_buf2. It is useful for processing high-priority characters such as software flow-control characters that could otherwise get stuck into the intermediate buffer until tty has room to receive them. Ldisc must be able to handle later a ->receive_buf or ->receive_buf2 call for the same characters (e.g. by skipping the actions for high-priority characters already handled by ->lookahead_buf).
Optional.
This structure defines the interface between the tty line discipline implementation and the tty routines. The above routines can be defined. Unless noted otherwise, they are optional, and can be filled in with a NULL pointer.
Hooks marked [TTY] are invoked from the TTY core, the [DRV] ones from the tty_driver side. π
π SEE ALSO π
Kernel file ./include/linux/tty_ldisc.h
xoxo, bestie β source/version ./include/linux, date October 2026, page struct tty_ldisc_ops(9) π
β¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms