Perl unpack/tacct file

Larry Wall lwall at jpl-devvax.jpl.nasa.gov
Tue May 7 08:53:35 AEST 1991


In article <1991May04.185409.24228 at pinhead.pegasus.com> todd at pinhead.pegasus.com (Todd Ogasawara) writes:
: 
: I just started using Perl a few weeks ago and have run into a problem when
: trying to use unpack to look at 'tacct' type accounting files on an 386 box
: running Interactive UNIX 2.2 (UNIX System V/386 R3). I'm pretty sure I
: understand the structure of this file type since C programs I've written to
: read it work fine. The C structure of this file looks like this:
: 
: #p = prime time, np = non-prime time
: #struct	tacct {
: #	unsigned short	ta_uid;		/* userid */
: #	char		ta_name[8];	/* login name */
: #	float		ta_cpu[2];	/* cum cpu time, p/np (mins) */
: #	float		ta_kcore[2];	/* cum kcore-minutes, p/np */
: #	float		ta_con[2];	/* cum connect time p/np, mins */
: #	float		ta_du;		/* cum disk usage */
: #	long		ta_pc;		/* count of processes */
: #	unsigned short	ta_sc;		/* count of login sessions */
: #	unsigned short	ta_dc;		/* count of disk samples */
: #	unsigned short	ta_fee;		/* fee for special services */
: #};
: 
: Here's the perl program I've tried to use to read a tacct file with. (BTW,
: I'm using Perl 4.0 patch level 3).
: 
: open(TACCT,"/usr/adm/acct/sum/tacct");
: 
: while(read(TACCT,$tacct,52)) {
: 	($uid,$name,$cpuP,$cpuNP,$kcoreP,$kcoreNP,$conP,$conNP,
: 	 $du,$pc,$sc,$dc,$fee) = 
: 		unpack("S A8 f f f f f f f l S S S",$tacct);
: 	local($TCONNECT) = $conP + $conNP;
: 	printf "%4d %8s %7.2f %d %d\n",
: 		$uid, $name, $TCONNECT, $sc, $dc;
: }
: 
: The $uid and $name variables contain what I expect it to. However,
: everything else that follows seems to be one off. I.e., The $dc variable
: should contain the number of disk samples but seems to contain the number
: of login sessions instead. The floating point values are all over the
: place. I know that I must be reading in the floating point variables
: incorrectly, but I don't know what it is that I'm doing wrong. BTW, I have
: the Wall & Schwartz "Programming Perl" book and have gone through the
: sections describing pack and unpack several times to try to understand what
: is going on here.

Your C compiler is probably throwing you a curve by aligning the first
float to a 4-byte boundary.  Try saying

		unpack("S A8 x2 f f f f f f f l S S S",$tacct);

Larry



More information about the Comp.unix.sysv386 mailing list