xref: /freebsd/lib/libutil++/freebsd__pidfile.3 (revision 159503125826bc2d3b988921e7e85735ee09ad46)
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