### 4.20 `fputs`, `fputs_unlocked`—write a character string in a file or stream

Synopsis

    #include <stdio.h>
    int fputs(const char *restrict s, FILE *restrict fp);

    #define _GNU_SOURCE
    #include <stdio.h>
    int fputs_unlocked(const char *restrict s, FILE *restrict fp);

    #include <stdio.h>
    int _fputs_r(struct _reent *ptr, const char *restrict s, FILE *restrict fp);

    #include <stdio.h>
    int _fputs_unlocked_r(struct _reent *ptr, const char *restrict s, FILE *restrict fp);

Description
`fputs` writes the string at s (but without the trailing null) to the file or stream identified by fp.

`fputs_unlocked` is a non-thread-safe version of `fputs`. `fputs_unlocked` may only safely be used within a scope protected by flockfile() (or ftrylockfile()) and funlockfile(). This function may safely be used in a multi-threaded program if and only if they are called while the invoking thread owns the (FILE *) object, as is the case after a successful call to the flockfile() or ftrylockfile() functions. If threads are disabled, then `fputs_unlocked` is equivalent to `fputs`.

`_fputs_r` and `_fputs_unlocked_r` are simply reentrant versions of the above that take an additional reentrant struct pointer argument: ptr.

Returns
If successful, the result is `0`; otherwise, the result is `EOF`.

Portability
ANSI C requires `fputs`, but does not specify that the result on success must be `0`; any non-negative value is permitted.

`fputs_unlocked` is a GNU extension.

Supporting OS subroutines required: `close`, `fstat`, `isatty`, `lseek`, `read`, `sbrk`, `write`.