Open File Descriptor 0 Dev Ttys000 C
- Mar 29, 2016 To the kernel, all open files are referred to by file descriptors. A file descriptor is a non-negative integer. By convention, UNIX System shells associate file descriptor 0 with the standard input.
- When I run a piece of code like read (0, buffer, 1024) in C, which by default in C file descriptor 0 is connected to keyboard, the shell allows me to type text in, because, we assume, read is waiting to read the contents of the character device 'standard input', aka the keyboard.
- Pointers to the Open File Table: One process can have multiple file descriptors point to the same entry (e.g., as a result of a call to dup) Multiple processes (e.g., a parent and child) can have file descriptors that point to the same entry; Pointers to the i-Node Table.
man7.org > Linux > man-pages |
Since each file descriptor has its own position, and the position is set to 0 when opening a file for reading, this command prints the whole file and doesn't affect the script. If you want to read back what you wrote, you need to either reopen the file or rewind the file descriptor (i.e. Set its position to 0).
NAME SYNOPSIS DESCRIPTION RETURN VALUE ERRORS VERSIONS CONFORMING TO NOTES BUGS SEE ALSO COLOPHON |
NAME top
SYNOPSIS top
DESCRIPTION top
RETURN VALUE top
ERRORS top
VERSIONS top
CONFORMING TO top
NOTES top
BUGS top
SEE ALSO top
COLOPHON top
Pages that refer to this page: strace(1), accept(2), access(2), chmod(2), chown(2), chroot(2), clone(2), close(2), copy_file_range(2), dup(2), epoll_create(2), epoll_ctl(2), eventfd(2), execveat(2), fanotify_init(2), fcntl(2), flock(2), fork(2), fsync(2), getrlimit(2), getxattr(2), inotify_init(2), ioctl(2), ioctl_fat(2), ioctl_tty(2), ioprio_set(2), io_submit(2), kcmp(2), link(2), listxattr(2), llseek(2), lseek(2), memfd_create(2), mkdir(2), mknod(2), mount(2), msgget(2), openat2(2), open_by_handle_at(2), perf_event_open(2), pidfd_getfd(2), pipe(2), prctl(2), read(2), readlink(2), readv(2), recv(2), removexattr(2), rename(2), seccomp(2), semget(2), send(2), sendfile(2), setxattr(2), shmget(2), signalfd(2), socket(2), spu_create(2), stat(2), statfs(2), statx(2), symlink(2), syscalls(2), timerfd_create(2), truncate(2), umask(2), unlink(2), uselib(2), userfaultfd(2), utimensat(2), write(2), catopen(3), dbopen(3), dirfd(3), euidaccess(3), ferror(3), fopen(3), fpathconf(3), fts(3), getcwd(3), getdirentries(3), getdtablesize(3), getfilecon(3), getpt(3), getutent(3), grantpt(3), handle(3), mkfifo(3), mkstemp(3), mq_open(3), opendir(3), popen(3), posix_openpt(3), posix_spawn(3), pthread_setname_np(3), remove(3), scandir(3), selinux_status_open(3), sem_open(3), setfilecon(3), shm_open(3), statvfs(3), stdin(3), stdio(3), tempnam(3), tmpnam(3), lp(4), random(4), st(4), proc(5), attributes(7), capabilities(7), cpuset(7), credentials(7), epoll(7), feature_test_macros(7), fifo(7), inode(7), inotify(7), mq_overview(7), path_resolution(7), pipe(7), pty(7), shm_overview(7), signal(7), signal-safety(7), symlink(7), unix(7), mount.fuse3(8), raw(8), tunelp(8), xfs_io(8)
HTML rendering created 2020-04-11 by Michael Kerrisk, author of The Linux Programming Interface, maintainer of the Linux man-pages project. For details of in-depth Linux/UNIX system programming training courses that I teach, look here. Hosting by jambit GmbH. |
Device files are supposed to represent physical devices. Most physical devices are used for output as well as input, so there has to be some mechanism for device drivers in the kernel to get the output to send to the device from processes. This is done by opening the device file for output and writing to it, just like writing to a file. In the following example, this is implemented by
This is not always enough. Imagine you had a serial port connected to a modem (even if you have an internal modem, it is still implemented from the CPU's perspective as a serial port connected to a modem, so you don't have to tax your imagination too hard). The natural thing to do would be to use the device file to write things to the modem (either modem commands or data to be sent through the phone line) and read things from the modem (either responses for commands or the data received through the phone line). However, this leaves open the question of what to do when you need to talk to the serial port itself, for example to send the rate at which data is sent and received.
The answer in Unix is to use a special function called
Open File Descriptor 0 Dev Ttys000 C 3
The ioctl number encodes the major device number, the type of the ioctl, the command, and the type of the parameter. This ioctl number is usually created by a macro call (
If you want to use
Example 7-1. C devs suck. chardev.c
Example 7-2. chardev.h
Example 7-3. ioctl.c
Notes[1]Notice that here the roles of read and write are reversed
This isn't exact. You won't be able to pass a structure, for example, through an ioctl --- but you will be able to pass a pointer to the structure.