From owner-freebsd-current Thu May 2 3:48:14 2002 Delivered-To: freebsd-current@freebsd.org Received: from relay1.macomnet.ru (relay1.macomnet.ru [195.128.64.10]) by hub.freebsd.org (Postfix) with ESMTP id 6676B37B41A for ; Thu, 2 May 2002 03:48:05 -0700 (PDT) Received: from news1.macomnet.ru (news1.macomnet.ru [195.128.64.14]) by relay1.macomnet.ru (8.11.6/8.11.6) with ESMTP id g42Am2X11416528; Thu, 2 May 2002 14:48:02 +0400 (MSD) Date: Thu, 2 May 2002 14:48:02 +0400 (MSD) From: Maxim Konovalov To: Terry Lambert Cc: current@freebsd.org Subject: Re: newsyslog(8) should wait(2) for children In-Reply-To: <3CD0F321.546D0694@mindspring.com> Message-ID: <20020502143234.C56711-100000@news1.macomnet.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On 01:04-0700, May 2, 2002, Terry Lambert wrote: > Maxim Konovalov wrote: > > > [ ... patch to wait for children, but do nothing with the result ... ] > > > > > > Why not just set the signal handler for the child process > > > termination to "ignore", so that the child processes do > > > not become zombied in the first place, so it's not ever > > > necessary to do a useless loop whose only purpose is to > > > reap zombies without examining their exit status? > > > > There are two purposes: > > > > a) reap zombies, > > b) exit after all children have done only. > > > > In the current implementation newsyslog(8) forks and execs gzip(1) or > > bzip2(1) and exits immediately. If a log file(s) is big enough the > > compress_log() process(es) will work after newsyslog's death and there > > is no clear way to get know when it(they)'s done. > > Your (a) is statisfied with either approach. > > I don't understand why you think (b) is a requirement. Let's imagine: # /usr/sbin/newsyslog && ./make_something_with_compressed_log newsyslog exited but there are several compress_log() processes are still running and make_something_with_compressed_log will get a half-compressed logs. > > OpenBSD: > > > > a) SIGCHLD signal handler: waitpid(2) loop, do not examine "status", > > b) the same waitpid(2) loop before exit(2). > > > > I do not think we need a) at all. newsyslog forks/execs all his > > children and enters into the reap loop like SIGCHLD signal handler > > does. > > The point of this is to not reap until you have to; the default > case will be no reaping necessary, so you are adding overhead > unnecessarily by atttempting to reap non-existant children. As you see, OpenBSD has (a) *and* (b). > > NetBSD: > > > > a) waitpid(2) for a child right after fork/exec, > > b) examine "status" and print an exit code. > > > > As you see, NetBSD newsyslog serializes fork/exec and there is only > > one gzip process at the same moment. We can take this way but IMHO it > > will be a POLA violation. [ NetBSD approach arguments ] > There are arguments for both approaches, but if you want to > wait for the operation to complete, the OpenBSD approach is > better than a reap-loop. Again, OpenBSD has a reap loop. [...] -- Maxim Konovalov, MAcomnet, Internet Dept., system engineer phone: +7 (095) 796-9079, mailto:maxim@macomnet.ru To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message