Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!lll-winken!tekbspa!uunet!auspex!guy From: guy@auspex.auspex.com (Guy Harris) Newsgroups: comp.unix.questions Subject: Re: How to find process name in c? Message-ID: <3667@auspex.auspex.com> Date: 15 Jul 90 02:59:38 GMT References: <200001@carter.BCASDL.BOEING.COM> Organization: Auspex Systems, Santa Clara Lines: 45 (Another one for the FAQ list? Or is it already there?) >Has anyone got a method for finding out if a process is running short of >"ps -ef | grep processname" in a pipe. There must be a better way from >within a c program. 1) Processes in most UNIX systems don't have names, they have process IDs. If you have 10 people on your machine running "cat", they are doing so in 10 distinct processes, but the "name" of those processes, as reported by "ps", will all be "cat". If they gave the same arguments to "cat", the entire command line as reported by "ps" should be the same. 2) The innards of "ps" differ quite a bit from UNIX implementation to UNIX implementation - including potentially from version to version of any particular thread of UNIX implementations. Some, but not all, provide programmatic interfaces to let you do some of what "ps" does; SunOS 4.x provides the "kvm" library, and some of the later S5 releases, including S5R4, provide "/proc". 3) If you know the process ID of the process, you can, in most modern UNIX systems, determine whether a process with that process ID exists; use the "kill" call to send that process signal number 0. This will not actually do anything *to* that process; however, it will do all the same checking that sending a real signal would do. As such, if the "kill" fails, returning -1 and setting "errno" to ESRCH, you know no process with that process ID exists; if it succeeds, or fails with any other error (e.g. EPERM), you know it exists. One caveat: different flavors of UNIX report different things if the process has exited but the corpse hasn't yet been reaped by its parent. As I remember, 4.2BSD and later indicate that it doesn't exist (I don't think 4.1BSD and earlier supported sending "signal 0"), and S5 systems report that it does (I forget whether S3 had "signal 0", but I don't think it did). POSIX appears to require the S5 behavior. Another caveat; I didn't say, in the first sentence of 3), "determine whether that process exists", I said "determine whether a process with that process ID exists". Your process could have exited; if enough time had passed since it did, and enough other processes created new processes with by forking, some new process could be assigned the same process ID as the old process, giving you a "false positive".