1*15950312SJohn Baldwin.\" 2*15950312SJohn Baldwin.\" SPDX-License-Identifier: BSD-2-Clause 3*15950312SJohn Baldwin.\" 4*15950312SJohn Baldwin.\" Copyright (c) 2025 Chelsio Communications, Inc. 5*15950312SJohn Baldwin.\" Written by: John Baldwin <jhb@FreeBSD.org> 6*15950312SJohn Baldwin.\" 7*15950312SJohn Baldwin.Dd July 31, 2025 8*15950312SJohn Baldwin.Dt FREEBSD::STRINGF 3 9*15950312SJohn Baldwin.Os 10*15950312SJohn Baldwin.Sh NAME 11*15950312SJohn Baldwin.Nm freebsd::pidfile 12*15950312SJohn Baldwin.Nd own a PID file handle 13*15950312SJohn Baldwin.Sh LIBRARY 14*15950312SJohn Baldwin.Lb libutil++ 15*15950312SJohn Baldwin.Sh SYNOPSIS 16*15950312SJohn Baldwin.In libutil++.hh 17*15950312SJohn Baldwin.Pp 18*15950312SJohn Baldwin.Vt class freebsd::pidfile 19*15950312SJohn Baldwin{ 20*15950312SJohn Baldwin.Bd -ragged -offset indent 21*15950312SJohn Baldwin.Fn pidfile 22*15950312SJohn Baldwin.Fn pidfile "struct pidfh *pfh" 23*15950312SJohn Baldwin.Fn pidfile "pidfile &&other" 24*15950312SJohn Baldwin.Fn ~pidfile 25*15950312SJohn Baldwin.Ft struct pidfh * 26*15950312SJohn Baldwin.Fn release 27*15950312SJohn Baldwin.Ft void 28*15950312SJohn Baldwin.Fn reset "struct pidfh *newpfh = nullptr" 29*15950312SJohn Baldwin.Ft int 30*15950312SJohn Baldwin.Fn write 31*15950312SJohn Baldwin.Ft int 32*15950312SJohn Baldwin.Fn close 33*15950312SJohn Baldwin.Ft int 34*15950312SJohn Baldwin.Fn fileno 35*15950312SJohn Baldwin.Ft "pidfile &" 36*15950312SJohn Baldwin.Fn operator= "pidfile &&other" 37*15950312SJohn Baldwin.Ft "pidfile &" 38*15950312SJohn Baldwin.Fn operator= "struct pidfh *pfh" 39*15950312SJohn Baldwin.Fn "explicit operator bool" 40*15950312SJohn Baldwin.Ed 41*15950312SJohn Baldwin}; 42*15950312SJohn Baldwin.Sh DESCRIPTION 43*15950312SJohn BaldwinEach instance of this class owns a PID file handle created by 44*15950312SJohn Baldwin.Xr pidfile_open 3 . 45*15950312SJohn BaldwinThis class is patterned on std::unique_ptr; 46*15950312SJohn Baldwinhowever, 47*15950312SJohn Baldwinrather than exporting the raw pointer via a 48*15950312SJohn Baldwin.Fn get 49*15950312SJohn Baldwinmethod, 50*15950312SJohn Baldwinthis class provides wrapper methods for each of the other 51*15950312SJohn Baldwin.Xr pidfile 3 52*15950312SJohn Baldwinfunctions. 53*15950312SJohn BaldwinThe currently-owned PID file is removed by invoking 54*15950312SJohn Baldwin.Xr pidfile_remove 3 55*15950312SJohn Baldwinwhen an instance of this class is destroyed. 56*15950312SJohn BaldwinThe currently-owned PID file is also removed if it is replaced by the 57*15950312SJohn Baldwin.Fn reset 58*15950312SJohn Baldwinmethod or assignment operators. 59*15950312SJohn Baldwin.Pp 60*15950312SJohn BaldwinThe 61*15950312SJohn Baldwin.Fn release 62*15950312SJohn Baldwinmethod relinquishes ownership of the current PID file handle and returns the 63*15950312SJohn Baldwinvalue of the previously-owned PID file handle. 64*15950312SJohn Baldwin.Pp 65*15950312SJohn BaldwinThe 66*15950312SJohn Baldwin.Fn write 67*15950312SJohn Baldwinmethod writes out the PID of the current process to the PID file via 68*15950312SJohn Baldwin.Xr pidfile_write 3 . 69*15950312SJohn Baldwin.Pp 70*15950312SJohn BaldwinThe 71*15950312SJohn Baldwin.Fn close 72*15950312SJohn Baldwinmethod closes the current PID file without removing it via 73*15950312SJohn Baldwin.Xr pidfile_close 3 . 74*15950312SJohn BaldwinIf the close succeeds, the PID file handle is no longer valid. 75*15950312SJohn Baldwin.Pp 76*15950312SJohn BaldwinThe 77*15950312SJohn Baldwin.Fn fileno 78*15950312SJohn Baldwinmethod returns the underlying file descriptor for the current PID file via 79*15950312SJohn Baldwin.Xr pidfile_fileno 3 . 80*15950312SJohn Baldwin.Pp 81*15950312SJohn BaldwinThe explicit 82*15950312SJohn Baldwin.Vt bool 83*15950312SJohn Baldwinconversion operator permits testing the validity of an object. 84*15950312SJohn BaldwinThe operator returns true if the instance owns a valid PID file handle. 85*15950312SJohn Baldwin.Sh EXAMPLES 86*15950312SJohn Baldwin.Bd -literal -offset indent 87*15950312SJohn Baldwinint 88*15950312SJohn Baldwinmain() 89*15950312SJohn Baldwin{ 90*15950312SJohn Baldwin freebsd::pidfile pf(pidfile_open("/var/run/daemon.pid", 91*15950312SJohn Baldwin 0600, NULL)); 92*15950312SJohn Baldwin if (!pf) 93*15950312SJohn Baldwin err(1, "pidfile_open"); 94*15950312SJohn Baldwin 95*15950312SJohn Baldwin if (daemon(0, 0) == -1) { 96*15950312SJohn Baldwin warn("daemon"); 97*15950312SJohn Baldwin return 1; 98*15950312SJohn Baldwin } 99*15950312SJohn Baldwin 100*15950312SJohn Baldwin pf->write(); 101*15950312SJohn Baldwin 102*15950312SJohn Baldwin for (;;) { 103*15950312SJohn Baldwin /* Do Work */ 104*15950312SJohn Baldwin } 105*15950312SJohn Baldwin 106*15950312SJohn Baldwin return 0; 107*15950312SJohn Baldwin} 108*15950312SJohn Baldwin.Ed 109*15950312SJohn Baldwin.Sh SEE ALSO 110*15950312SJohn Baldwin.Xr pidfile 3 111