⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmprocess.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sftest.h"/*	Test to see if multiple writers to the same file create**	a consistent set of records.*/#define N_PROC	3#define N_REC	1000#define B_SIZE	256#if __STD_Cstatic ssize_t inspect(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)#elsestatic ssize_t inspect(f, buf, n, disc)Sfio_t*		f;Void_t* 	buf;size_t		n;Sfdisc_t*	disc;#endif{	int	w, k;	char*	s;	Sfio_t*	sf;	if(*((char*)buf + n-1) != '\n')		terror("Not writing a whole record\n");	sf = sfnew(NIL(Sfio_t*),(Void_t*)buf,n,-1,SF_STRING|SF_READ);	while((s = sfgetr(sf,'\n',0)) )	{	w = sfvalue(sf)-1;		if(s[0] != s[w-1]-1)			terror("Bad record\n");		k = (s[2]-'0')*10 + (s[3]-'0');		if(k != w)			terror("Expect %d, get %d\n",k,w);	}	sfclose(sf);	if((w = write(sffileno(f),buf,n)) != (int)n)		terror("Write %d returns %d\n",n,w);	return w;}static Sfdisc_t	Disc[N_PROC];MAIN(){	ssize_t		size[N_PROC][N_REC];	int		count[N_PROC];	char		record[N_PROC][128], *s, *file;	int		i, r, n, pid;	Sfio_t*		f;	Sfio_t*		fa[N_PROC];	char		buf[N_PROC][B_SIZE], b[N_PROC][128];	unsigned long	u;	/* create pseudo-random record sizes */	u = 1;	for(i = 0; i < N_PROC; ++i)	for(r = 0; r < N_REC; ++r)	{	u = u * 0x63c63cd9L + 0x9c39c33dL;		size[i][r] = (ssize_t)(u%63) + 16;	}	/* records for different processes */	for(i = 0; i < N_PROC; ++i)	for(r = 0; r < 128; ++r)		record[i][r] = '0' + 2*i;	/* create file */	file = tstfile(0);	if(!(f = sfopen(NIL(Sfio_t*),file,"w+")) )		terror("Opening temporary file %s\n", file);	/* open file for appending */	for(i = 0; i < N_PROC; ++i)		if(!(fa[i] = sfopen(NIL(Sfio_t*), file, "a")) )			terror("Open %s to append", file);	/* fork processes */	for(i = 0; i < N_PROC; ++i)	{#ifdef DEBUG#define FORK()		0#define RETURN(v)#else#define FORK()		fork()#define RETURN(v)	exit(v)#endif		if((pid = (int)FORK()) < 0 )			terror("Creating process %d\n", i);		else if(pid == 0)		{	/* write to file */			sfsetbuf(fa[i], (Void_t*)buf[i], sizeof(buf[i]));			sfset(fa[i], SF_WHOLE, 1);			Disc[i].writef = inspect;			sfdisc(fa[i], &Disc[i]);			for(r = 0; r < N_REC; ++r)			{	n = size[i][r]; s = b[i];				memcpy(s,record[i],n-1);				s[1] = '(';				s[2] = ((n-1)/10) + '0';				s[3] = ((n-1)%10) + '0';				s[4] = ')';				s[n-2] = s[0] + 1;				s[n-1] = '\n';				if(sfwrite(fa[i],s,n) != n)					terror("sfwrite failed");			}			sfsync(fa[i]);			RETURN(0);		}	}	for(i = 0; i < N_PROC; ++i)	{	wait(&r);		count[i] = 0;	}	n = 0;	while((s = sfgetr(f,'\n',0)) )	{	n += 1;		if((i = s[0] - '0') < 0 || (i%2) != 0 || (i /= 2) >= N_PROC )			terror("%d: Wrong record type\n", n);		r = sfvalue(f);		if(s[r-2] != s[0]+1)			terror("%d: process%d, number=%d\n", n, i, count[i]);		for(r -= 3; r > 4; --r)			if(s[r] != s[0])				terror("%d: process%d, count=%d\n", n, i, count[i]);		if(sfvalue(f) != size[i][count[i]])			terror("%d: process%d number=%d expected size=%d read size=%d\n",				n, i, count[i], size[i][count[i]], sfvalue(f));		count[i] += 1;	}	for(i = 0; i < N_PROC; ++i)		if(count[i] != N_REC)			terror("Bad count%d %d\n", i, count[i]);	TSTEXIT(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -