Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!udel!haven!decuac!bacchus.pa.dec.com!shodha.enet.dec.com!alan From: alan@shodha.enet.dec.com ( Alan's Home for Wayward Notes File.) Newsgroups: comp.unix.ultrix Subject: Re: how do you write a program to determine free swap (like pstat -s) Summary: Depends on the version. Message-ID: <1927@shodha.enet.dec.com> Date: 7 Nov 90 03:16:02 GMT References: <1990Nov6.033516.18772@NCoast.ORG> <1990Nov7.015529.15623@wrl.dec.com> Organization: Digital Equipment Corp. - Colorado Springs, CO. Lines: 82 In article <1990Nov7.015529.15623@wrl.dec.com>, mogul@wrl.dec.com (Jeffrey Mogul) writes: > In article <1990Nov6.033516.18772@NCoast.ORG> simpsong@NCoast.ORG (Gregory R. Simpson @ The North Coast) writes: > >I'd like to write a simple vm_check program that returns > >nothing except the amount of swap remaining... (which is > >all I'm interested in... > > As you might have guessed from the output of /etc/pstat -s, > there isn't simple value stored in the kernel that says "this > much swap space is in use"; rather, pstat grovels through > kernel data structures counting things up, and computes > a total through a fairly hairy computation. I counted over > 160 lines in pstat just to do what you're asking for. Actually it depends on what version of ULTRIX you're running. In V3.1 and earlier. It's the really hairy stuff that Jeff mentioned. In V4.0 there is a data structure called "swapu" that has how much is being used for various things. The amount free is just the total - the amount used. You can get total from adding amount indicated in the "swdevt" table. > > Since the Ultrix version of pstat.c carries the usual Digital/AT&T > copyright, I can't post that on the net. If you get a 4.2BSD > source tape, I suspect that the code to do this calculation hasn't > changed all that much, so perhaps starting with that version of > pstat.c, you can create a program to do what you want. > In general such things look something like: /* * Correctly dealing with errors, counting up the amount of * page/swap space and getting the units right is left as an * exercise to the reader. */ #include #include #include #include void exit(), nlist() ; off_t lseek() ; struct nlist nl[] = { { "_swapu" }, #define NM_SWAPU 0 { 0 }, }; main() { register rc, fd ; struct swapu_t data ; nlist("/vmunix", nl) ; if((fd = open("/dev/kmem", O_RDONLY)) == -1 ) exit(-1) ; if( lseek(fd, (off_t)nl[NM_SWAPU].n_value, L_SET) == -1 ) exit(-1) ; if( read(fd, (char *)&data, sizeof(data)) == -1 ) exit(-1) ; printf("%d\n", data.total_used) ; printf("%d\n", data.wasted) ; if( close(fd) == -1 ) exit(-1) ; return 0 ; } You may season to taste. > -Jeff -- Alan Rollow alan@nabeth.enet.dec.com