write (system call)
The write is one of the most basic routines provided by a Unix-like operating system kernel. It writes data from a buffer declared by the user to a given device, such as a file. This is the primary way to output data from a program by directly using a system call. The destination is identified by a numeric code. The data to be written, for instance a piece of text, is defined by a pointer and a size, given in number of bytes.
write
thus takes three arguments:
- The file code (file descriptor or fd).
- The pointer to a buffer where the data is stored (buf).
- The number of bytes to write from the buffer (nbytes).
POSIX usage
[edit]The write call interface[1][2][3] is standardized by the POSIX specification. Data is written to a file by calling the write function. The function prototype is:
ssize_t write(int fildes, const void *buf, size_t nbyte);
Argument | Description |
---|---|
fildes | The file descriptor obtained from a call to open(). It is an integer value. The values 0, 1, 2 can also be given, for standard input, standard output & standard error, respectively . |
buf | Points to a character array, with content to be written to the file pointed to by filedes. |
nbyte | Specifies the number of bytes to be written from the character array, buf, into the file pointed to by filedes. |
In above syntax, ssize_t
is a typedef
. It is a signed data type defined in stddef.h
. Note that write()
does not return an unsigned value; it returns -1 if an error occurs so it must return a signed value.
The write function returns the number of bytes successfully written into the file, which may at times be less than the specified nbytes. It returns -1 if an exceptional condition is encountered, see section on errors below.
Linux
[edit]Historically, Linux would use different system call tables for different architectures. write
has the call number 1 on x86-64[4], but 4 on ARM[5]. However, more recent architectures supported by Linux have adopted a universal system call table, in which write
's call number is 64[6].
When compiling software, the kernel exposes the call numbers for the target architecture as integer constants in the C header <linux/unistd.h>
[7]. Several macros are defined in the form of __NR_xxx
, which expand to the call number for the system call xxx
. As such, write
's call number is exposed as __NR_write
. This header may also be included by assembler code using the C preprocessor.
See also
[edit]References
[edit]- ^ http://www.unix.com/man-page/FreeBSD/2/write/ Manual page for Write
- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I/O Primitives
- ^ "Write".
- ^ "linux/arch/x86/entry/syscalls/syscall_64.tbl at fb4d33ab452ea254e2c319bac5703d1b56d895bf · torvalds/linux". GitHub. Retrieved 19 June 2025.
- ^ "linux/arch/arm64/tools/syscall_32.tbl at fb4d33ab452ea254e2c319bac5703d1b56d895bf · torvalds/linux". GitHub. Retrieved 19 June 2025.
- ^ "linux/scripts/syscall.tbl at fb4d33ab452ea254e2c319bac5703d1b56d895bf · torvalds/linux". GitHub. Retrieved 19 June 2025.
- ^ "linux/include/uapi/linux/unistd.h at fb4d33ab452ea254e2c319bac5703d1b56d895bf · torvalds/linux". GitHub. Retrieved 19 June 2025.
External links
[edit]- POSIX write
C_Programming/C_Reference/stdio.h/fwrite at Wikibooks