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