xref: /illumos-gate/usr/src/man/man3proc/proc_initstdio.3proc (revision a7d7cafedfa26f9e421bbcaf42b7387ef67c0a31)
143051d27SRobert Mustacchi.\"
243051d27SRobert Mustacchi.\" This file and its contents are supplied under the terms of the
343051d27SRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
443051d27SRobert Mustacchi.\" You may only use this file in accordance with the terms of version
543051d27SRobert Mustacchi.\" 1.0 of the CDDL.
643051d27SRobert Mustacchi.\"
743051d27SRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
843051d27SRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
943051d27SRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
1043051d27SRobert Mustacchi.\"
1143051d27SRobert Mustacchi.\"
1243051d27SRobert Mustacchi.\" Copyright 2015 Joyent, Inc.
1343051d27SRobert Mustacchi.\"
14*a7d7cafeSRobert Mustacchi.Dd November 27, 2023
1543051d27SRobert Mustacchi.Dt PROC_INITSTDIO 3PROC
1643051d27SRobert Mustacchi.Os
1743051d27SRobert Mustacchi.Sh NAME
1843051d27SRobert Mustacchi.Nm proc_initstdio ,
1943051d27SRobert Mustacchi.Nm proc_flushstdio ,
2043051d27SRobert Mustacchi.Nm proc_finistdio
2143051d27SRobert Mustacchi.Nd stdio buffering functions
22*a7d7cafeSRobert Mustacchi.Sh LIBRARY
2343051d27SRobert Mustacchi.Lb libproc
24*a7d7cafeSRobert Mustacchi.Sh SYNOPSIS
2543051d27SRobert Mustacchi.In libproc.h
2643051d27SRobert Mustacchi.Ft int
2743051d27SRobert Mustacchi.Fo proc_initstdio
2843051d27SRobert Mustacchi.Fa void
2943051d27SRobert Mustacchi.Fc
3043051d27SRobert Mustacchi.Ft int
3143051d27SRobert Mustacchi.Fo proc_flushstdio
3243051d27SRobert Mustacchi.Fa void
3343051d27SRobert Mustacchi.Fc
3443051d27SRobert Mustacchi.Ft int
3543051d27SRobert Mustacchi.Fo proc_finistdio
3643051d27SRobert Mustacchi.Fa void
3743051d27SRobert Mustacchi.Fc
3843051d27SRobert Mustacchi.Sh DESCRIPTION
3943051d27SRobert MustacchiThe
4043051d27SRobert Mustacchi.Fn proc_initstdio ,
4143051d27SRobert Mustacchi.Fn proc_flushstdio ,
4243051d27SRobert Mustacchiand
4343051d27SRobert Mustacchi.Fn proc_finistdio
4443051d27SRobert Mustacchifunctions are utilities provided to aid with the possibility of deadlock
4572d3dbb9SYuri Pankovwhile doing I/O operations.
4672d3dbb9SYuri PankovIf a process is trying to do I/O, but holding the process handle that would
4772d3dbb9SYuri Pankovconsume that I/O, then eventually the program holding the process handle will
4872d3dbb9SYuri Pankovblock as none of its I/O has been drained.
4972d3dbb9SYuri PankovHowever, because it is holding a process handle to that process, it will never
5072d3dbb9SYuri Pankovbe drained.
5143051d27SRobert Mustacchi.Pp
5243051d27SRobert MustacchiConsider, for example, the following invocation:
5343051d27SRobert Mustacchi.Li pfiles `pgrep xterm`
5472d3dbb9SYuri Pankovwhere the command was launched from a shell on an xterm.
5572d3dbb9SYuri PankovBecause the xterm is stopped, it will not be able to write out any of the
5672d3dbb9SYuri Pankovstandard out that gets passed to it, leading to a deadlock.
5772d3dbb9SYuri PankovThe
5843051d27SRobert Mustacchi.Li pfiles
5943051d27SRobert Mustacchiprogram cannot release the
6043051d27SRobert Mustacchi.Li xterm
6143051d27SRobert Mustacchiprocess because it still has pending I/O, but the I/O cannot be drained
6243051d27SRobert Mustacchidue to the same hold.
6343051d27SRobert Mustacchi.Pp
6443051d27SRobert MustacchiTo address this, these functions duplicate the standard output and
6543051d27SRobert Mustacchistandard error of the process to temporary files and then flushes it out
6672d3dbb9SYuri Pankovto the original file descriptors and streams later.
6772d3dbb9SYuri PankovWhen finished, the original file descriptors are restored as standard out and
6872d3dbb9SYuri Pankovstandard error.
6943051d27SRobert Mustacchi.Pp
7043051d27SRobert MustacchiThe
7143051d27SRobert Mustacchi.Fn proc_initstdio
7243051d27SRobert Mustacchifunction initializes a new standard out and standard error file
7343051d27SRobert Mustacchidescriptors and retains the originals.
7443051d27SRobert Mustacchi.Pp
7543051d27SRobert MustacchiThe
7643051d27SRobert Mustacchi.Fn proc_flushstdio
7743051d27SRobert Mustacchifunctions flushes all of the cached data from the temporary standard out
7872d3dbb9SYuri Pankovand standard error back to the underlying ones.
7972d3dbb9SYuri PankovThis function should only be called after all process handles have been
8072d3dbb9SYuri Pankovreleased.
8172d3dbb9SYuri PankovFor example, if iterating on multiple processes, calling this after handling
8243051d27SRobert Mustacchieach one is safe.
8343051d27SRobert Mustacchi.Pp
8443051d27SRobert MustacchiThe
8543051d27SRobert Mustacchi.Fn proc_finistdio
8643051d27SRobert Mustacchiflushes any outstanding I/O and restores the original standard output
8743051d27SRobert Mustacchiand standard error.
8843051d27SRobert Mustacchi.Pp
8943051d27SRobert MustacchiOnce called, the
9043051d27SRobert Mustacchi.Fn proc_initstdio
9143051d27SRobert Mustacchifunction must not be called again until a successful call to
9243051d27SRobert Mustacchi.Fn proc_finistdio .
9343051d27SRobert Mustacchi.Sh RETURN VALUES
9443051d27SRobert MustacchiUpon successful completion, the
9543051d27SRobert Mustacchi.Fn proc_initstdio ,
9643051d27SRobert Mustacchi.Fn proc_flushstdio ,
9743051d27SRobert Mustacchiand
9843051d27SRobert Mustacchi.Fn proc_finistdio
9943051d27SRobert Mustacchifunctions all return
10043051d27SRobert Mustacchi.Sy 0 .
10143051d27SRobert MustacchiOtherwise,
10243051d27SRobert Mustacchi.Sy -1
10343051d27SRobert Mustacchiis returned to indicate failure.
10443051d27SRobert Mustacchi.Sh INTERFACE STABILITY
10543051d27SRobert Mustacchi.Sy Uncommitted
10643051d27SRobert Mustacchi.Sh MT-LEVEL
10743051d27SRobert Mustacchi.Sy Unsafe
10843051d27SRobert Mustacchi.Sh SEE ALSO
10943051d27SRobert Mustacchi.Xr libproc 3LIB ,
11043051d27SRobert Mustacchi.Xr Pgrab 3PROC ,
11143051d27SRobert Mustacchi.Xr Prelease 3PROC
112